SQL - Ist die Reihenfolge der WHERE-Bedingungen wichtig?

74

Angenommen, dies category_idist ein Indexschlüssel (kein Primärschlüssel) der Tabelle books. Gibt es einen Unterschied zwischen den folgenden beiden SQL-Anweisungen?

SELECT * FROM books WHERE author='Bill' AND category_id=1

SELECT * FROM books WHERE category_id=1 AND author='Bill'

Ich denke, das Filtern von Datensätzen zuerst nach category_idund dann nach authorist schneller als das Filtern in umgekehrter Reihenfolge. Sind SQL-Engines intelligent genug, um dies zu tun?

Powerboy
quelle
1
Ich habe gesucht, bevor ich gepostet habe. Weiß jemand, wie man diesen Beitrag bearbeitet, um die Suche zu erleichtern, wenn später jemand anderes die gleiche Frage hat?
Powerboy
@OMG _ Remus Rusanu hat diesen Link vor kurzem auf eine Frage gepostet. Vielleicht war es das? rusanu.com/2009/09/13/…
Martin Smith
@ Martin Smith: Ich wusste nicht, dass Remus einen Blog hat, sehr cool. Hast du einen Link, wo der Blog-Link gepostet wurde?
OMG Ponys
@OMG - Ja. Es war hier ... stackoverflow.com/questions/3088709/…
Martin Smith
2
Mögliches Duplikat von Does Reihenfolge, wo Klauseln in SQL wichtig sind
Viktor Mellgren

Antworten:

69

Nein, die Reihenfolge der WHERE-Klauseln spielt keine Rolle.

Der Optimierer überprüft die Abfrage und ermittelt anhand von Indizes und dergleichen, wie die Daten am besten abgerufen werden können. Selbst wenn es einen Deckungsindex für die Spalten category_id und author geben würde - beide würden die Kriterien für die Verwendung erfüllen (vorausgesetzt, es gibt nichts Besseres).

OMG Ponys
quelle
Obwohl ich damit einverstanden bin, möchte ich hinzufügen, dass ich Ihre Logik anordnen würde, die bei Verwendung von oder Anweisungen sofort vergeht oder bei Verwendung von und Anweisungen sofort fehlschlägt. Sie müssen keine anderen Kriterien überprüfen, wenn Sie dies sofort herausfinden können.
Spinon
Können Statistiken, die nicht aktuell sind, dies beeinflussen?
Abe Miessler
1
@Abe Miessler: Ja, Statistiken und Indizes, die nicht mehr aktuell sind, können sich negativ auf die Auswahl des Optimierers auswirken. Aber je mehr Daten, desto teurer kann es sein, diese auf dem neuesten Stand zu halten.
OMG Ponys
Gilt das auch für MySQL?
Drew
1
@ AndrewHeath: Meines Wissens gilt dies für Datenbanken (ohne NoSQL-Varianten)
OMG Ponies
10

SQL ist deklarativ .

In Ihrem Beispiel haben Sie der Engine / dem Optimierer mitgeteilt, was Sie möchten. Nun wird der beste Weg gefunden, dies zu tun (im Rahmen von Vernunft und "Kosten", die nicht zum Thema gehören würden).

gbn
quelle
6
+1 für die wahre Aussage. Trotzdem ist Prolog deklarativ und dennoch (zumindest bei Implementierungen, die ich verwendet habe) ist die Reihenfolge der Bedingungen von Bedeutung.
Justin K
5

Nein, im Allgemeinen wird davon ausgegangen, dass Sie eine moderne Datenbank verwenden. Vielleicht war es vor zehn Jahren wichtig.

Dean J.
quelle
Ja. Es scheint, als würde das Oracle Rule Based Optimizer (RBO) bei der Entwicklung eines Ausführungsplans die Reihenfolge der Prädikate in einer where-Klausel berücksichtigen.
Shannon Severance
3
+1 für den Hinweis, dass ältere RDBMS-Systeme diese Funktion möglicherweise nicht haben.
Nuzzolilo
2

Kurz gesagt, nein, sie spielen keine Rolle, da der Optimierer das beste Mittel zum Abrufen der Daten ermittelt.

Ajdams
quelle
1

Ja, SQL ist eine deklarative Sprache. In SQL Server (bei anderen Engines nicht sicher) kann ein DBA dies jedoch (irgendwie) tun, indem er einen Ausführungsplan im SQL Query Store erzwingt.

Geben Sie hier die Bildbeschreibung ein

Aber ja, Sie können es nicht über Ihre App oder über den Abfragetext selbst steuern.

PS 2 weitere Cent: Sie können die Reihenfolge der JOINs mithilfe von steuern FORCE ORDER.

Alex
quelle