Dieser Thread ist ziemlich alt, wird aber immer noch oft erwähnt. Für meinen persönlichen Geschmack ist es etwas unvollständig, da es eine andere Möglichkeit gibt, die Datenbank mit dem Schlüsselwort EXISTS abzufragen, das ich häufig als schneller empfand.
Wenn Sie also nur an Werten aus Tabelle a interessiert sind, können Sie diese Abfrage verwenden:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
Der Unterschied kann sehr groß sein, wenn col nicht indiziert ist, da die Datenbank nicht alle Datensätze in b finden muss, die den gleichen Wert in col haben, sondern nur den allerersten. Wenn es keinen Index für b.col gibt und viele Datensätze im Ba-Tabellenscan die Folge sein könnten. Mit IN oder einem JOIN wäre dies ein vollständiger Tabellenscan, mit EXISTS wäre dies nur ein teilweiser Tabellenscan (bis der erste übereinstimmende Datensatz gefunden wird).
Wenn es in b viele Datensätze gibt, die denselben Spaltenwert haben, verschwenden Sie auch viel Speicher, um alle diese Datensätze in einen temporären Bereich zu lesen, um festzustellen, ob Ihre Bedingung erfüllt ist. Mit vorhanden kann dies in der Regel vermieden werden.
Ich habe EXISTS oft schneller als IN gefunden, selbst wenn es einen Index gibt. Dies hängt vom Datenbanksystem (dem Optimierer), den Daten und nicht zuletzt von der Art des verwendeten Index ab.