SELECT Statement Processing

Jede SQL–Abfrage, die Sie an einen Server senden, muss drei (vier – im Falle von SELECT) Phasen durchlaufen. Zunächst sucht Oracle im Bibliothekscache nach einem passenden SQL-Hash. Wenn der Hash gefunden wird, ruft er nur den zugehörigen Erklärungsplan ab und führt ihn aus. Wenn nicht, wird eine harte Analyse aufgerufen -> das bedeutet, dass die folgenden Schritte ausgeführt werden müssen.

  1. ANALYSIEREN
    • Syntaxprüfung
    • Semantikprüfung
    • Privilegienprüfung
  2. BIND
    • Bind-/Hostvariablen durch tatsächliche Werte ersetzen
  3. EXEC
    • tatsächliche Ausführung basierend auf einem Explain-Plan
  4. FETCH (nur SELECT-Anweisungen)
    • gibt eine Ergebnismenge an einen Benutzer zurück

Lassen Sie mich jede Phase im folgenden Beispiel erklären.

Sie haben diese Abfrage ausgeführt:

WÄHLEN *
VOM Mitarbeiter;
WÄHLEN SIE * VON Mitarbeiter;

SELECT *FROM employee;

Der Serverprozess generiert einen Hash für die aktuelle SQL-Abfrage. Der Hash ist ein hexadezimaler Wert, der basierend auf dem Text der SQL-Abfrage generiert wird. Hier kommt der sehr wichtige Teil!! Selbst die geringste Änderung (Groß- zu Kleinschreibung und umgekehrt; Hinzufügen / Entfernen eines Leerzeichens; …) ändert den Hash und kann daher zu einer harten Analyse führen (mehr zur harten Analyse im Vergleich zur weichen Analyse unten). Sie müssen sehr vorsichtig sein und versuchen, sich nur an einen Code zu halten – deshalb funktionieren Prozeduren am besten (darüber hinaus verwenden sie meistens Bind–Variablen, die in Oracles Augen identische Abfragen generieren).

Sie können es einfach selbst überprüfen, indem Sie die folgenden Abfragen ausführen:

— führen Sie diese Abfrage zuerst aus
WÄHLEN SIE * AUS dual;
— führen Sie diese dann erneut mit allen Großbuchstaben aus
WÄHLEN SIE * AUS DUAL;
— überprüfen Sie die SQL-Hashes
WÄHLEN SIE sql_id
, sql_text
, hash_wert
VON v $ sql
WO 1=1
UND niedriger (sql_text) WIE ‚%select%from dual%‘;
sql_id | sql_text / Hash_wert
————————————————–
0x735fvggtnu6 / WÄHLEN SIE * AUS DUAL | 3741111110
3vyt9wdmca69b / WÄHLEN * VON dual | 1724193067
— Wie Sie sehen können, hat Oracle es als zwei verschiedene Abfragen ausgewertet.
— führen Sie zuerst diese Abfrage ausselect * FROM dual;- führen Sie diese dann erneut mit allen Großbuchstabenselect * FROM DUAL;– überprüfen Sie die SQL-Hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1UND niedriger (sql_text) WIE ‚%select%from dual%‘; sql_id | sql_text | hash_value————————————————– 0x735fvggtnu6 / SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual / 1724193067 – Wie Sie sehen können, hat Oracle es als zwei verschiedene Abfragen ausgewertet.

-- first run this querySELECT * FROM dual;-- then run this one again with all uppercase lettersSELECT * FROM DUAL;-- check the sql hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND lower(sql_text) LIKE '%select%from dual%'; sql_id | sql_text | hash_value--------------------------------------------------0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067-- As you can see Oracle evaluated it as two different queries.

Sobald der Hash generiert wurde, prüft Oracle, ob diese Abfrage in dieser Instanz bereits ausgeführt wurde. Wie? Indem überprüft wird, ob der Hash bereits im SQL-Bereich vorhanden ist.

Angenommen, diese Abfrage ist noch nicht verfügbar, wird ein SQL-Bereich mit dem Hashwert für diese Abfrage erstellt, und das Orakel initiiert die erste Stufe der Abfrageverarbeitung, nämlich PARSE .

  • Während der Syntaxprüfung überprüft Oracle die Abfrage, ob sie syntaktisch korrekt ist (SELECT anstelle von SELECT; die richtige Reihenfolge der Befehle -> SELECT * FROM table ORDER BY col1 WHERE col2 = ‚John‘; etc).
  • Der nächste Schritt sind Semantikprüfungen, bei denen Oracle überprüft, ob die Spaltennamen und Objektnamen korrekt sind. Wie? Durch Gegenprüfung mit Data Dictionary Cache
  • Im letzten Schritt der Analysephase überprüft Oracle, ob der Benutzer / die Anwendung über die richtigen Berechtigungen für den Zugriff auf abgefragte Objekte verfügt.

Sobald dies beendet ist, ist der SQL–Bereich gültig und ein anderes Tool in Oracle namens OPTIMIZER generiert einen Ausführungsplan – das heißt, der OPTIMIERER entscheidet, wie die Abfrage ausgeführt wird. Nachdem der beste Ausführungsplan ausgewählt wurde, bindet Oracle alle Variablen und fährt mit dem dritten Schritt fort – der Ausführung.

Was wird hier passieren? Oracle liest Datenblöcke zu abgefragten Objekten und bringt sie in den Puffercache (falls sie dort noch nicht angezeigt werden. Wenn sie da sind, wird Oracle sie nicht mehr lesen!). Dieser Prozess generiert E / A (was, wie ich im Artikel Computing Architecture erwähnt habe, im Vergleich zum Lesen aus dem Speicher sehr langsam ist). Ich werde hier für eine Weile aufhören und die I / O-Generation betonen. Beim Soft Parse werden alle Daten aus dem Speicher (Puffercache) gelesen, was viel schneller ist als das Lesen von einer Festplatte. Aus diesem Grund müssen Sie sich bemühen, Ihre Abfragen so weit wie möglich zu recyceln / wiederzuverwenden. Jede Änderung einer Abfrage generiert einen neuen Hash und generiert daher höchstwahrscheinlich E / A. All dies wird weiterhin vom Serverprozess verarbeitet.

Nachdem sich die Daten bereits im Speicher (Puffercache) befinden, wird die SELECT-Anweisung verarbeitet und die letzte Stufe (FETCH) ausgelöst und die Ergebnismenge an den Benutzer zurückgegeben.

Wenn dieselbe Abfrage erneut ausgeführt wird, wird der Hash generiert, und da der SQL-Bereich für diesen Hash bereits vorhanden ist, wird die Analysestufe übersprungen und nur EXEC und FETCH werden ausgeführt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.