Angenommen, ich habe eine Tabelle PEOPLE
mit 3 Spalten ID, LastName, FirstName
. Keine dieser Spalten ist indiziert.
LastName
ist einzigartiger und FirstName
weniger einzigartig.
Wenn ich 2 Suchen mache:
select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"
Meiner Meinung nach ist das zweite Kriterium schneller, da das eindeutigere Kriterium ( LastName
) in der where
Klausel an erster Stelle steht und Datensätze effizienter beseitigt werden. Ich denke nicht, dass der Optimierer klug genug ist, um die erste SQL zu optimieren.
Ist mein Verständnis richtig?
sql
performance
where-clause
Ziyang Zhang
quelle
quelle
Antworten:
Nein, diese Reihenfolge spielt keine Rolle (oder sollte zumindest keine Rolle spielen).
Jedes anständige Abfrageoptimierungsprogramm überprüft alle Teile der
WHERE
Klausel und findet heraus, wie diese Abfrage am effizientesten erfüllt werden kann.Ich weiß, dass das SQL Server-Abfrageoptimierungsprogramm einen geeigneten Index auswählt - unabhängig davon, in welcher Reihenfolge Sie Ihre beiden Bedingungen haben. Ich gehe davon aus, dass andere RDBMS ähnliche Strategien haben.
Entscheidend ist, ob Sie dafür einen geeigneten Index haben oder nicht!
Im Fall von SQL Server wird wahrscheinlich ein Index verwendet, wenn Sie:
(LastName, FirstName)
(FirstName, LastName)
(LastName)
oder just(FirstName)
(oder beides)Wenn Sie jedoch - wiederum für SQL Server - alle Spalten aus einer Tabelle
SELECT *
abrufen und die Tabelle eher klein ist, besteht eine gute Chance, dass das Abfrageoptimierungsprogramm nur einen Tabellen- (oder Clustered-Index-) Scan durchführt, anstatt sie zu verwenden ein Index (weil das Nachschlagen der vollständigen Datenseite, um alle anderen Spalten abzurufen, sehr schnell zu teuer wird).quelle
WHERE T1.col_1/T2.col_2 > 10 AND T2.col_2 <> 0
und bekam einenDIVIDE BY 0
Fehler. Nachdem ich die Reihenfolge geändert hatte, wurden die Bedingungen, unter denen die Abfrage erfolgreich ausgeführt wurde. Dann habe ich die Bestellung zurückgeschaltet, damit ich erwarten kann, dass der Fehler erneut auftritt, aber diesmal hat es funktioniert! Am Ende war meine Schlussfolgerung, dass die Bestellung für den ersten Lauf wichtig ist, bis der Ausführungsplan erstellt wird. Danach funktioniert die Bestellung nicht mehr 'egal', weil der Optimierer / Exec-Plan sich darum kümmern wirdDie Reihenfolge der WHERE-Klauseln sollte in einer Datenbank, die dem SQL-Standard entspricht, keinen Unterschied machen. Die Reihenfolge der Auswertung ist in den meisten Datenbanken nicht garantiert.
Denken Sie nicht, dass SQL sich um die Reihenfolge kümmert. Folgendes erzeugt einen Fehler in SQL Server:
Wenn der erste Teil dieser Klausel zuerst ausgeführt würde, würden nur numerische Tabellennamen als Ganzzahlen umgewandelt. Dies schlägt jedoch fehl und liefert ein klares Beispiel dafür, dass SQL Server (wie bei anderen Datenbanken) die Reihenfolge der Klauseln in der WHERE-Anweisung nicht berücksichtigt.
quelle
ISNUMERIC(table_name) = 1
zuerst ausgewertet wurde, wirdCAST
immer nur für numerische Tabellennamen aufgerufen. Da es jedoch nicht zuerst ausgewertet wird,CAST
wird es auch für nicht numerische Tabellennamen ausgewertet, was die Fehlermeldung verursacht.ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf
6.3.3.3 Reihenfolge der Regelbewertung
...
Wenn die Priorität nicht durch die Formate oder durch Klammern bestimmt wird, wird eine effektive Bewertung der Ausdrücke im Allgemeinen von links nach rechts durchgeführt. Es ist jedoch implementierungsabhängig, ob Ausdrücke tatsächlich von links nach rechts ausgewertet werden, insbesondere wenn Operanden oder Operatoren dazu führen können, dass Bedingungen ausgelöst werden, oder ob die Ergebnisse der Ausdrücke bestimmt werden können, ohne alle Teile des Ausdrucks vollständig auszuwerten.
von hier kopiert
quelle
Nein, alle RDBMs analysieren zunächst die Abfrage und optimieren sie, indem Sie Ihre where-Klausel neu anordnen.
Abhängig davon, welches RDBM Sie verwenden, können Sie das Ergebnis der Analyse anzeigen (suchen Sie beispielsweise nach dem Erklärungsplan in Oracle).
M.
quelle
Ursprüngliche OP-Erklärung
Ich denke, Sie verwechseln dies mit der Auswahl der Spaltenreihenfolge beim Erstellen der Indizes, in denen Sie die selektiveren Spalten an erster Stelle als an zweiter Stelle setzen müssen und so weiter.
Übrigens führt der SQL Server-Optimierer für die beiden oben genannten Abfragen keine Optimierung durch, verwendet jedoch den Trivila-Plan, solange die Gesamtkosten des Plans unter den Parallelitätsschwellenkosten liegen.
quelle
Es ist wahr, soweit es geht, vorausgesetzt, die Namen sind nicht indiziert. Unterschiedliche Daten würden es jedoch falsch machen. Um herauszufinden, wie dies zu tun ist, was jedes Mal anders sein kann, müsste das DBMS für jede Spalte eine eigene Zählabfrage ausführen und die Zahlen vergleichen, was mehr kosten würde, als nur mit den Schultern zu zucken und damit fortzufahren.
quelle