Angenommen, dies category_id
ist 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_id
und dann nach author
ist schneller als das Filtern in umgekehrter Reihenfolge. Sind SQL-Engines intelligent genug, um dies zu tun?
Antworten:
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).
quelle
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).
quelle
Nein, im Allgemeinen wird davon ausgegangen, dass Sie eine moderne Datenbank verwenden. Vielleicht war es vor zehn Jahren wichtig.
quelle
Kurz gesagt, nein, sie spielen keine Rolle, da der Optimierer das beste Mittel zum Abrufen der Daten ermittelt.
quelle
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.
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
.quelle