Frage

Frage 1:

Wenn wir eine Abfrage ausführen, wird die Änderung Ausführungsplan für jeden und jedes Mal, wenn die Abfrage ausgeführt wird?

Wenn ja, jede Leistung schlagen?

Wenn nein, dann, wenn wir etwas in der Tabelle ändern, das heißt, einen Index hinzufügen, wie funktioniert die databse wissen, dass es etwas, das es verwenden kann, für eine schnellere Ausführung des Ausführungsplan ändern?

Frage 2:

Aber was die allgemeine Reihenfolge der Ausführung ist, während eine Join-Abfrage ausgeführt wird, vor allem wenn es viele Joins (Außen-, Innen-, natürlich, wenn viele außen).

War es hilfreich?

Lösung

  • Um genau zu sein für SQL Server :

Sie haben höchstens zwei Pläne in Cache (eine parallele, eine nicht-parallel). Dann wird der Plan mit einem Ausführungskontext verwendet pro Benutzer. Mehr Infos in meiner Antwort hier

  • JOIN, um in fast allen Fällen irrelevant ist

SQL ist deklarative. Dies bedeutet, dass Sie den Motor sagen, was Sie wollen, und der optimiser ausarbeitet den besten Plan (innerhalb Grundes, es könnte 2 Wochen, um den besten zu erarbeiten). Aus diesem Grund Sie Abfragen viele verschiedene Möglichkeiten, umschreiben kann die gleiche Antwort zu erhalten.

Wie alle Regeln über RDBMS gibt es Ausnahmen. Für komplexe Abfragen, gehen die Optimierers wird nicht durch jede Permutation so die Reihenfolge egal kann JOIN: es hängt davon ab, wenn der Optimierer entscheidet es genug hat ...

Andere Tipps

(Unter der Annahme, SQL Server hier, Sie nicht angeben, ...)

Ausführungspläne werden zwischengespeichert, und in dem Maße Sie Ihre Anfragen parametrieren, kann wiederverwendet werden.

Wenn Sie die zugrunde liegende Tabelle oder Indizes ändern, weiß, SQL Server das Änderungsdatum dieser Dinge gegen den zwischengespeicherten Ausführungsplan und kann die Abfrage für die neuen Bedingungen neu bewerten. Das Gleiche gilt, wenn Statistiken aktualisiert werden ... manchmal die eigentlichen Daten treibt den Plan, nicht nur die Tabelle / Index-Design.

Joins werden nicht in einer Reihenfolge auf innere vs äußere Basis getan, sondern auf das, was der Optimierer denkt in der Abfrage führen wird am meisten schnell ausgeführt. Die Details werden variieren zwischen Datenbanken. Aber im Grunde versuchen die Abfrage-Optimierer die Verwendung von Indizes zu optimieren.

Angenommen, Sie diese Abfrage hat:

select a.foo, b.bar
from a
join b on b.b_id=a.b_id
where a.some_number=42;

Nehmen wir nun an, dass Sie einen eindeutigen Index für b.b_id haben aber keinen Index auf a.some_number.

Der Abfrageoptimierer hat dann zwei Möglichkeiten: Es könnte ein Full-File-sequenziell auf b lesen tun, und dann für jedes b tut 42 ein Full-File-sequenzielle Lesen auf einer Suche nach einem Spiel auf b_id und some_number =. Das ist eine ^ b Aufzeichnungen lesen. Oder es könnte ein Full-File-sequenzielle auf einem für some_number suchen lesen do = 42, dann für jeden ein könnte es den Index verwenden, um schnell den Datensatz aus b mit passendem b_id zu finden. Das heißt, ein * 2 Datensätze lesen. Nun offensichtlich der zweite Plan ist viel besser, so dass das, was sie wählen werden.

Wie Sie mehr Tabellen die Berechnung hinzufügen, wird komplizierter, aber das Prinzip ist das gleiche. Schließt sich dieses Ergebnis in einem schnellen Index gelesen später erfolgt unter Verwendung in anderen Tabellen gefundenen Werte werden, nachdem die anderen Tabellen gelesen wurden. Tabellen, die der Reihe nach ganz gleich gelesen werden müssen, was, oder wo das Lesen auf Konstanten anstatt Werte von den anderen Datensätzen basiert, werden zunächst im Allgemeinen lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top