Guten Abend nochmal!
Wir starten den zweiten Stream unseres neuen Kurses
„Relational DBMS“ , den wir gemäß den Ergebnissen des ersten Laufs ein wenig abgeschlossen haben: Zusätzliche Klassen in MySQL- und Postgres-Clustern wurden von Docker und verschiedenen anderen „Dateiverbesserungen“ als gefragt eingestuft. Erwarten Sie also offene Lektionen (in denen einige der alten Themen herausgenommen wurden) und interessante Materialien. Heute beschäftigen wir uns mit den Techniken von Oracle.
Lass uns gehen.
Oracle-Bitmap-Indizes unterscheiden sich stark von Standard-B-Tree-Indizes. In Bitmap-Strukturen wird ein zweidimensionales Array mit einer Spalte für jede Zeile in der indizierten Tabelle erstellt. Jede Spalte repräsentiert einen separaten Wert im Bitmap-Index. Dieses zweidimensionale Array zeigt jeden Indexwert multipliziert mit der Anzahl der Zeilen in dieser Tabelle.
Oracle dekomprimiert die Bitmap (mit Zeilenabrufgeschwindigkeit) in den RAM-Datenpuffer, um schnell nach übereinstimmenden Werten zu suchen. Diese übereinstimmenden Werte werden als Zeilen-ID-Liste an Oracle übergeben, und Zeilen-ID-Werte können direkt auf die erforderlichen Informationen zugreifen.

Ein besonderer Vorteil der Bitmap-Indizierung zeigt sich, wenn eine einzelne Tabelle mehrere Bitmap-Indizes enthält. Die Leistung jeder Spalte kann gering sein. Das Erstellen mehrerer Bitmap-Indizes bietet einen sehr leistungsstarken Ansatz für die schnelle Beantwortung komplexer SQL-Abfragen.

Mithilfe der Bitmap-Pooling-Methode reduziert Oracle die Antwortzeit auf weniger als eine Sekunde, wenn mit mehreren Spalten mit einer kleinen Anzahl von Elementen gearbeitet wird.
Beachten Sie auch
wichtige Hinweise zu den Maximalwerten des Oracle-Bitmap-Index .
Stellen Sie sich zum Beispiel vor, es gibt eine Datenbank mit Autos mit einer großen Anzahl von Spalten mit geringem Stromverbrauch: car_color, car_make, car_model und car_year. Jede Spalte enthält weniger als 100 verschiedene Werte, und der B-Tree-Index wäre in einer solchen Datenbank von 20 Millionen Autos völlig nutzlos.
Das Zusammenführen dieser Indizes zu einer Abfrage kann jedoch eine hohe Antwortzeit bieten, die viel schneller ist als die herkömmliche Methode zum Lesen jeder der 20 Millionen Zeilen in der Basistabelle. Nehmen wir zum Beispiel an, wir wollen den alten blauen Toyota Corolla finden, der 1981 hergestellt wurde:
select license_plat_nbr from vehicle where color = "blue" and make = "toyota" and year = 1981;
Um mit dieser Abfrage zu arbeiten, verwendet Oracle eine spezielle Optimierungsmethode, die als Kombinieren von Bitmap-Indizes bezeichnet wird. Bei dieser Methode wird jede Zeilen-ID-Liste (kurz RID) mithilfe von Bitmaps separat erstellt, und ein spezielles Zusammenführungsverfahren wird verwendet, um RID-Listen zu vergleichen und nach überlappenden Werten zu suchen.
Wenn die Anzahl der verschiedenen Werte zunimmt, nimmt die Bitmap-Größe exponentiell zu. Ein Index mit 100 Werten kann also 1.000 Mal schneller ausgeführt werden als der Bitmap-Index mit 1.000 verschiedenen Spaltenwerten.
Es ist zu beachten, dass Bitmap-Indizes nur für statische Tabellen und materialisierte Ansichten geeignet sind, die nachts aktualisiert und nach dem Batch-Laden von Zeilen neu erstellt werden. Wenn in Ihrer Tabelle mehrere DML pro Sekunde vorkommen, seien Sie vorsichtig, wenn Sie Bitmap-Indizes implementieren!
- 1 bis 7 verschiedene Schlüsselwerte - Abfragen mit Bitmap-Indizes mit geringem Stromverbrauch sind sehr schnell.
- 8 - 100 verschiedene Schlüsselwerte - Mit zunehmender Anzahl verschiedener Werte nimmt die Produktivität proportional ab;
- 100 - 10.000 verschiedene Werte - Mit mehr als 100 verschiedenen Werten werden Bitmap-Indizes sehr groß und die SQL-Leistung sinkt schnell.
- Mehr als 10.000 verschiedene Schlüsselwerte - In dieser Phase ist die Leistung zehnmal niedriger als bei einem Index mit 100 verschiedenen Werten.
Oracle Bitmap-Indizes sind eine sehr leistungsstarke Funktion von Oracle, aber es gibt Fallstricke!
In den folgenden Fällen möchten Sie den Bitmap-Index verwenden:
- Die Tabellenspalte ist leichtgewichtig. Berücksichtigen Sie im DRAFT-Handbuch eine Bitmap für jeden Index mit weniger als 100 verschiedenen Werten:
select region, count(*) from sales group by region;
- NIEDRIGE DML-Tabellen - Die Verwendung zum Einfügen / Aktualisieren / Löschen sollte gering sein. Das Aktualisieren von Bitmap-Indizes erfordert viele Ressourcen, sodass sie besser für schreibgeschützte Tabellen und jede Nacht stapelaktualisierte Tabellen geeignet sind.
- Mehrere Spalten - Ihre SQL-Abfragen beziehen sich auf mehrere Felder mit geringer Kardinalität in der Where-Anweisung. Das Vorhandensein von Bitmap-Indizes erleichtert die Arbeit des Oracle-Optimierers, der eine Schätzung auf der Grundlage der Kosten vornimmt (kurz: CBO (Cost-Based Optimizer)).
Fehlerbehebung bei Oracle Bitmap-IndizesZu den häufigsten Problemen bei der Implementierung des Bitmap-Index gehören:
- Kleiner Tisch - CBO erfordert möglicherweise einen vollständigen Tabellenscan, wenn er zu klein ist!
- Schlechte Statistiken - Stellen Sie sicher, dass Sie die Bitmap direkt nach der Erstellung mit dbms_stats analysieren:
CREATE BITMAP INDEX emp_bitmap_idx ON index_demo (gender); exec dbms_stats.gather_index_stats(OWNNAME=>'SCOTT', INDNAME=>'EMP_BITMAP_IDX');
- Tooltip-Test - Um Ihren neuen Bitmap-Index zu verwenden, verwenden Sie den Oracle INDEX-Tooltip:
select /*+ index(emp emp_bitmap_idx) */ count(*) from emp, dept where emp.deptno = dept.deptno;
Wir warten hier auf Fragen und Kommentare oder kommen zu unserer neuen
offenen Lektion .