Programmieren lernen: Unterschied zwischen EXISTS und in SQL?


Antwort 1:

Die EXISTS-Klausel ist viel schneller als IN, wenn die Unterabfrageergebnisse sehr groß sind.

Umgekehrt ist die IN-Klausel schneller als EXISTS, wenn die Unterabfrageergebnisse sehr klein sind.

Auch die IN-Klausel kann nichts mit NULL-Werten vergleichen, aber die EXISTS-Klausel kann alles mit NULL-Werten vergleichen.

Früher war Exists schneller, weil es aufhörte, sobald es ein Beispiel aus der Unterabfrage fand. IN würde die Unterabfrage beenden.

Jetzt behandelt der Optimierer sie in vielen rdbms-Systemen gleich.


Antwort 2:

EXISTS verwendet eine korrelierte Unterabfrage.

IN verwendet eine eigenständige Unterabfrage.

Unter der Haube arbeiten diese beiden Arten von Unterabfragen auf sehr unterschiedliche Weise.

Korrelierte Unterabfragen haben ein Übereinstimmungsprädikat in der WHERE-Klausel, das 1 oder mehr Spalten aus der Unterabfrage mit 1 oder mehr Spalten im äußeren Dataset übereinstimmt. Der entscheidende Punkt bei Corelated Subqueries ist, dass sie einmal für jede Zeile im äußeren Datensatz ausgeführt werden. Dies bedeutet, dass sie manchmal keine gute Leistung erbringen, insbesondere wenn das Übereinstimmungsprädikat in der korrelierten Unterabfrage keinen hochselektiven Index verwendet (und manchmal sogar, wenn ein Index verwendet wird).

Stellen Sie sich einen hypothetischen Fall vor, in dem das äußere Dataset eine Million Zeilen enthält. In diesem Fall muss die korrelierte Unterabfrage einmal pro Zeile eine Million Mal ausgeführt werden. Um die Sache noch schlimmer zu machen, nehmen Sie an, dass das Dataset in der Unterabfrage ebenfalls ein großes Dataset ist und nicht für die Spalte (n) indiziert ist, für die Sie eine Übereinstimmung finden. In diesem Fall wäre die Abfrage sehr ineffizient und würde eine Menge Ressourcen verbrauchen. Es kann nicht einmal eine praktikable Abfrage sein.

Damit korrelierte Unterabfragen möglich sind, insbesondere wenn die Daten skaliert werden, müssen Sie die Größe des äußeren Datasets minimieren und sicherstellen, dass das innere Dataset in den Spalten indiziert ist, die am Übereinstimmungsprädikat teilnehmen.

Eine gute Sache an EXISTS ist, dass es zur Optimierung Kurzschlüsse verwendet. Ein Kurzschluss tritt auf, wenn das Datenbankmodul eine Zeile findet, die der EXISTS-Logik entspricht. Sobald eine einzelne Zeile gefunden wurde, die der Prädikatenlogik entspricht, hat sie alle erforderlichen Informationen erhalten, da die EXISTS-Klausel zu TRUE geführt hat. Es muss nicht überprüft werden, ob weitere Übereinstimmungen für den aktuellen Wert vorhanden sind, und die Daten werden daher nicht mehr durchsucht. Auf diese Weise kann es zum nächsten Wert übergehen, auf den es prüfen muss.

Eigenständige Unterabfragen werden einmal für die gesamte Abfrage ausgeführt, unabhängig davon, wie viele Zeilen sich in der inneren oder äußeren Datenmenge befinden. Das Datenbankmodul führt die eigenständige Unterabfrage EINMAL aus und vergleicht dann die Ergebnisse der Unterabfrage mit dem äußeren Dataset, um die Abfrage aufzulösen.

Ich sollte auch beachten, dass Sie in einigen Fällen JOINs anstelle von Unterabfragen verwenden können, um die gewünschten Ergebnisse zu erhalten. Dies ist möglicherweise die optimalste Lösung. Unter der Haube kann der Abfrageanalysator die Abfrage, die JOIN verwendet, physisch ausführen, genauso wie die Abfrage, die IN verwendet.


Antwort 3:

EXISTS verwendet eine korrelierte Unterabfrage.

IN verwendet eine eigenständige Unterabfrage.

Unter der Haube arbeiten diese beiden Arten von Unterabfragen auf sehr unterschiedliche Weise.

Korrelierte Unterabfragen haben ein Übereinstimmungsprädikat in der WHERE-Klausel, das 1 oder mehr Spalten aus der Unterabfrage mit 1 oder mehr Spalten im äußeren Dataset übereinstimmt. Der entscheidende Punkt bei Corelated Subqueries ist, dass sie einmal für jede Zeile im äußeren Datensatz ausgeführt werden. Dies bedeutet, dass sie manchmal keine gute Leistung erbringen, insbesondere wenn das Übereinstimmungsprädikat in der korrelierten Unterabfrage keinen hochselektiven Index verwendet (und manchmal sogar, wenn ein Index verwendet wird).

Stellen Sie sich einen hypothetischen Fall vor, in dem das äußere Dataset eine Million Zeilen enthält. In diesem Fall muss die korrelierte Unterabfrage einmal pro Zeile eine Million Mal ausgeführt werden. Um die Sache noch schlimmer zu machen, nehmen Sie an, dass das Dataset in der Unterabfrage ebenfalls ein großes Dataset ist und nicht für die Spalte (n) indiziert ist, für die Sie eine Übereinstimmung finden. In diesem Fall wäre die Abfrage sehr ineffizient und würde eine Menge Ressourcen verbrauchen. Es kann nicht einmal eine praktikable Abfrage sein.

Damit korrelierte Unterabfragen möglich sind, insbesondere wenn die Daten skaliert werden, müssen Sie die Größe des äußeren Datasets minimieren und sicherstellen, dass das innere Dataset in den Spalten indiziert ist, die am Übereinstimmungsprädikat teilnehmen.

Eine gute Sache an EXISTS ist, dass es zur Optimierung Kurzschlüsse verwendet. Ein Kurzschluss tritt auf, wenn das Datenbankmodul eine Zeile findet, die der EXISTS-Logik entspricht. Sobald eine einzelne Zeile gefunden wurde, die der Prädikatenlogik entspricht, hat sie alle erforderlichen Informationen erhalten, da die EXISTS-Klausel zu TRUE geführt hat. Es muss nicht überprüft werden, ob weitere Übereinstimmungen für den aktuellen Wert vorhanden sind, und die Daten werden daher nicht mehr durchsucht. Auf diese Weise kann es zum nächsten Wert übergehen, auf den es prüfen muss.

Eigenständige Unterabfragen werden einmal für die gesamte Abfrage ausgeführt, unabhängig davon, wie viele Zeilen sich in der inneren oder äußeren Datenmenge befinden. Das Datenbankmodul führt die eigenständige Unterabfrage EINMAL aus und vergleicht dann die Ergebnisse der Unterabfrage mit dem äußeren Dataset, um die Abfrage aufzulösen.

Ich sollte auch beachten, dass Sie in einigen Fällen JOINs anstelle von Unterabfragen verwenden können, um die gewünschten Ergebnisse zu erhalten. Dies ist möglicherweise die optimalste Lösung. Unter der Haube kann der Abfrageanalysator die Abfrage, die JOIN verwendet, physisch ausführen, genauso wie die Abfrage, die IN verwendet.


Antwort 4:

EXISTS verwendet eine korrelierte Unterabfrage.

IN verwendet eine eigenständige Unterabfrage.

Unter der Haube arbeiten diese beiden Arten von Unterabfragen auf sehr unterschiedliche Weise.

Korrelierte Unterabfragen haben ein Übereinstimmungsprädikat in der WHERE-Klausel, das 1 oder mehr Spalten aus der Unterabfrage mit 1 oder mehr Spalten im äußeren Dataset übereinstimmt. Der entscheidende Punkt bei Corelated Subqueries ist, dass sie einmal für jede Zeile im äußeren Datensatz ausgeführt werden. Dies bedeutet, dass sie manchmal keine gute Leistung erbringen, insbesondere wenn das Übereinstimmungsprädikat in der korrelierten Unterabfrage keinen hochselektiven Index verwendet (und manchmal sogar, wenn ein Index verwendet wird).

Stellen Sie sich einen hypothetischen Fall vor, in dem das äußere Dataset eine Million Zeilen enthält. In diesem Fall muss die korrelierte Unterabfrage einmal pro Zeile eine Million Mal ausgeführt werden. Um die Sache noch schlimmer zu machen, nehmen Sie an, dass das Dataset in der Unterabfrage ebenfalls ein großes Dataset ist und nicht für die Spalte (n) indiziert ist, für die Sie eine Übereinstimmung finden. In diesem Fall wäre die Abfrage sehr ineffizient und würde eine Menge Ressourcen verbrauchen. Es kann nicht einmal eine praktikable Abfrage sein.

Damit korrelierte Unterabfragen möglich sind, insbesondere wenn die Daten skaliert werden, müssen Sie die Größe des äußeren Datasets minimieren und sicherstellen, dass das innere Dataset in den Spalten indiziert ist, die am Übereinstimmungsprädikat teilnehmen.

Eine gute Sache an EXISTS ist, dass es zur Optimierung Kurzschlüsse verwendet. Ein Kurzschluss tritt auf, wenn das Datenbankmodul eine Zeile findet, die der EXISTS-Logik entspricht. Sobald eine einzelne Zeile gefunden wurde, die der Prädikatenlogik entspricht, hat sie alle erforderlichen Informationen erhalten, da die EXISTS-Klausel zu TRUE geführt hat. Es muss nicht überprüft werden, ob weitere Übereinstimmungen für den aktuellen Wert vorhanden sind, und die Daten werden daher nicht mehr durchsucht. Auf diese Weise kann es zum nächsten Wert übergehen, auf den es prüfen muss.

Eigenständige Unterabfragen werden einmal für die gesamte Abfrage ausgeführt, unabhängig davon, wie viele Zeilen sich in der inneren oder äußeren Datenmenge befinden. Das Datenbankmodul führt die eigenständige Unterabfrage EINMAL aus und vergleicht dann die Ergebnisse der Unterabfrage mit dem äußeren Dataset, um die Abfrage aufzulösen.

Ich sollte auch beachten, dass Sie in einigen Fällen JOINs anstelle von Unterabfragen verwenden können, um die gewünschten Ergebnisse zu erhalten. Dies ist möglicherweise die optimalste Lösung. Unter der Haube kann der Abfrageanalysator die Abfrage, die JOIN verwendet, physisch ausführen, genauso wie die Abfrage, die IN verwendet.