ich diesen Absatz in der Oracle-Dokumentation gefundenReihenfolge der Tabellen in Join-Abfrage
, wenn Sie den Namen jeder Abteilung zusammen mit dem Namen seines Manager auswählen möchten, können Sie die Abfrage in schreiben kann man auf zwei Arten. Im ersten Beispiel , die folgt, der Hinweis/++ bestellt ++/ sagt, die Join in der Reihenfolge der Tabellen erscheinen in der FROM-Klausel mit versuchen, die Join-Reihenfolge zu optimieren.
SELECT /*+ordered*/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS#
oder:
SELECT /*+ordered*/ d.NAME, e.NAME FROM EMP e, DEPT d WHERE d.MGR = e.SS#
Nehmen wir an, es gibt 10 Abteilungen und 1000 Mitarbeiter, und dass die innere Tabelle in jeder Abfrage einen Index für hat die Join-Spalte. In der ersten Abfrage erzeugt die erste Tabelle 10 qualifizierende Zeilen (in diesem Fall die gesamte Tabelle). In der zweiten Abfrage erzeugt die erste Tabelle 1000 qualifizierende Zeilen. Die erste Abfrage greift 10mal auf die EMP-Tabelle zu und durchsucht die DEPT-Tabelle einmal. Die zweite Abfrage scannt die Tabelle EMP einmal, greift jedoch 1000 Mal auf die Tabelle DEPT zu. Daher wird die erste Abfrage viel besser funktionieren. Als eine Faustregel sollten Tabellen von kleinsten effektiven Nummer Zeilen zu größten effektiven Anzahl der Zeilen angeordnet werden. Die effektive Zeilengröße einer Tabelle in einer Abfrage wird durch erhalten, wobei die logischen Bedingungen angewendet werden, die vollständig in dieser Tabelle aufgelöst werden.
Aber ich verstehe das nicht richtig. Wenn es m
Zeilen in Tabelle t1 und n
Zeilen in Tabelle t2 gibt, würde die SQL-Engine nicht in beiden Fällen m x n
Zeilen durchlaufen?
Update: Danke für alle Antworten. Ich werde den Optimierer nicht außer Kraft setzen, wollte nur meinen Gedanken bestätigen.
Können Sie bitte einen Link auf das Dokument veröffentlichen, wo Sie das lesen? –
Sie fehlen die 'WHERE'-Klausel in Ihrer zweiten Abfrage, die in der Oracle-Dokumentation enthalten ist. –
@Peter - Where-Klausel hinzugefügt :) – Jerry