Diese Frage ist anhand eines Beispiels am besten erklärt!
Example - IN:
Diese liefert ALLE Datensätze von Tabelle1, wo die Spalte1 von Tabelle1 GLEICH der Spalte1 von Tabelle2 ist. (Tabelle1.Spalte1 = Tabelle2.Spalte1)
Jedoch wird für JEDEN Datensatz des äußeren Select-Stmt der Subselect in der where - Klause ausgeführt. Dies ist sehr performanceintensiv, vor allem, wenn Tabelle1 ODER Tabelle2 sehr viele Datensätze beinhaltet!!!
Example - EXISTS:
Diese liefert ALLE Datensätze von Tabelle1, wo die Spalte1 von Tabelle1 GLEICH der Spalte1 von Tabelle2 ist. (Tabelle1.Spalte1 = Tabelle2.Spalte1)
(wie bei "Example - IN")
Unterschied zu Example - IN:
Hier wird die äußere Select - Anweisung ausgeführt und das SQL-Resultset im Cache des DBMS gespeichert. Anschließend wird das Subselect ausgeführt und ebenfalls im Cache gespeichert.
Zuletzt werden beide SQL-Resultsets herangezogen und gejoined!!
Daher kommen wir wieder auf das gleiche Ergebnis ( Tabelle1.Spalte1 = Tabelle2.Spalte1 )
Somit ist die Performance deutlich besser als bei "IN"!!
Ich hoffe, ich habe mich verständlich ausgedrückt und es ist nachvollziehbar!
Lg
Example - IN:
Code:
select *
from tabelle1 t1
where t1.spalte1 IN ( select t2.spalte1 from tabelle2 t2 )
Diese liefert ALLE Datensätze von Tabelle1, wo die Spalte1 von Tabelle1 GLEICH der Spalte1 von Tabelle2 ist. (Tabelle1.Spalte1 = Tabelle2.Spalte1)
Jedoch wird für JEDEN Datensatz des äußeren Select-Stmt der Subselect in der where - Klause ausgeführt. Dies ist sehr performanceintensiv, vor allem, wenn Tabelle1 ODER Tabelle2 sehr viele Datensätze beinhaltet!!!
Example - EXISTS:
Code:
select *
from tabelle1 t1
where EXISTS ( select 'x' from tabelle2 t2 where t1.Spalte1 = t2.Spalte1 )
Diese liefert ALLE Datensätze von Tabelle1, wo die Spalte1 von Tabelle1 GLEICH der Spalte1 von Tabelle2 ist. (Tabelle1.Spalte1 = Tabelle2.Spalte1)
(wie bei "Example - IN")
Unterschied zu Example - IN:
Hier wird die äußere Select - Anweisung ausgeführt und das SQL-Resultset im Cache des DBMS gespeichert. Anschließend wird das Subselect ausgeführt und ebenfalls im Cache gespeichert.
Zuletzt werden beide SQL-Resultsets herangezogen und gejoined!!
Daher kommen wir wieder auf das gleiche Ergebnis ( Tabelle1.Spalte1 = Tabelle2.Spalte1 )
Somit ist die Performance deutlich besser als bei "IN"!!
Ich hoffe, ich habe mich verständlich ausgedrückt und es ist nachvollziehbar!
Lg