Oracle Tipps von Burleson Consulting |
Innerhalb dieser beiden Optimierer bietet Oracle mehrere Optimierungsmodi. Ein Optimierungsmodus kann für die gesamte Datenbank oder für eine bestimmte Oracle-Sitzung festgelegt werden. Die Optimierungsmodi umfassen rule, first_rows, all_rows und choose. Schauen wir uns jedes dieser Ziele genauer an.
Regelmodus
Der Regelhinweis ignoriert den CBO und die Statistiken und generiert einen Ausführungsplan, der ausschließlich auf den grundlegenden Datenwörterbuchinformationen basiert. Es ist immer eine gute Idee, eine bestimmte SQL-Anweisung mithilfe des RBO mithilfe eines Regelhinweises oder durch Ausgabe der Regel alter session set optimizer_goal= zu optimieren. Denken Sie jedoch immer daran, dass der RBO möglicherweise einen nicht idealen Index für die Bearbeitung einer Abfrage auswählt.
Optimizer_mode=choose
Im Optimierungsmodus choose kann Oracle das am besten geeignete Optimierungsziel auswählen. Dies ist der Standardoptimierungsmodus in Oracle und verwendet im Allgemeinen das Vorhandensein von Statistiken, um zu bestimmen, welcher Optimierer aufgerufen werden soll. Wenn keine Statistiken vorhanden sind, verwendet Oracle das Regelziel. Wenn Statistiken vorhanden sind, wählt Oracle first_rows oder all_rows, abhängig vom Vorhandensein von Indizes und der Einstellung für Parallelität und db_file_multiblock_read_count.
Warnung: Unvollständige Statistiken im Choose Optimizer-Modus können zu erheblichen Verlangsamungen führen. Wenn Oracle eine einzelne Tabelle in einer Abfrage mit Statistiken erkennt, verwendet es den kostenbasierten Optimierer und berechnet zur Laufzeit Statistiken für die anderen Tabellen. Dies kann zu einer erheblichen Verlangsamung der SQL-Ausführung führen. Dieses Problem tritt bei Oracle Remote DBA-Anfängern sehr häufig auf, da der Standardmodus choose ist und Remote-DBAs für Anfänger manchmal selektiv den Befehl analyze ausgeben, ohne zu bemerken, dass sie die SQL-Ausführungszeiten beeinflussen.
first_rows-Modus
Dies ist ein kostenbasierter Optimierungsmodus, der Zeilen so schnell wie möglich zurückgibt, selbst wenn die Gesamtabfrage länger ausgeführt wird oder mehr Ressourcen verbraucht. Der first_rows-Optimierungsmodus beinhaltet normalerweise die Auswahl eines Vollindex-Scans gegenüber einem parallelen Volltabellenscan. Da der first_rows-Modus Indexscans gegenüber vollständigen Tabellenscans bevorzugt, ist der first_rows-Modus am besten für Online-Systeme geeignet, bei denen der Endbenutzer einige Ergebnisse so schnell wie möglich sehen möchte.
all_rows-Modus
Dies ist ein kostenbasierter Optimierungsmodus, der sicherstellt, dass die gesamte Abfragezeit minimiert wird, auch wenn der Empfang der ersten Zeile länger dauert. Dies beinhaltet normalerweise die Auswahl eines parallelen Volltabellenscans gegenüber einem Vollindex-Scan. Da der all_rows-Modus vollständige Tabellenscans bevorzugt, eignet sich der all_rows-Modus am besten für stapelorientierte Abfragen, bei denen keine Zwischenzeilen zum Anzeigen erforderlich sind.
Was ist „besser“? Schnelle Ausführung vs. minimaler Ressourcenverbrauch.
Um die Philosophie von Oracle in Bezug auf schnelle Ausführung und minimalen Ressourcenverbrauch zu verstehen, müssen wir uns ein einfaches Beispiel ansehen. Um den Unterschied zwischen all_rows und first_rows anhand eines zu vereinfachenden Beispiels zu veranschaulichen, betrachten Sie die folgende Abfrage:
select
last_name
from
customer
order by
last_name;
Diese Abfrage kann auf zwei Arten bearbeitet werden:
-
Full-Table Scan – Hier führen wir parallel einen Full-Table Scan durch und sortieren die Zeilen im TEMP Tablespace. Nehmen wir zur Veranschaulichung an, dass dieser Ausführungsplan die schnellste Gesamtausführungszeit und den minimalen Ressourcenverbrauch liefert (Abbildung 2).
Abbildung 2: Durchführen eines vollständigen Tabellenscans und einer Sortierung (all_rows)
-
Vollständiger Index-Scan – Hier rufen wir die Zeilen in der Reihenfolge last_name mithilfe eines last_name_index ab. Diese Technik führt zu mehr physischen Lesevorgängen, gibt jedoch sortierte Zeilen fast sofort zurück (Abbildung 3).
Abbildung 3: Führen Sie erneut einen Indexabruf durch (first_rows)
Angenommen, wir akzeptieren den vollständigen Tabellenscan und die Sortierung ist weniger E / A-intensiv als der vollständige Indexscan, dann können wir den Unterschied in den Optimierungszielen deutlich erkennen. Der Vollindex-Scan beginnt fast sofort mit der Rückgabe von Zeilen auf Kosten zusätzlicher E / A, während der Volltabellenscan weniger Ressourcen benötigt, die Ergebnismenge jedoch erst am Ende der Abfrage verfügbar ist.
Dies ist ein Auszug aus „Oracle High-Performance SQL Tuning“ von Donald K. Burleson, veröffentlicht von Oracle Press.