Der größte Unterschied besteht nicht in der Verbindung vs nicht existiert, es ist (wie geschrieben), die SELECT *
.
Im ersten Beispiel erhalten Sie alle Spalten von beiden A
und B
im zweiten Beispiel nur Spalten von A
.
In SQL Server ist die zweite Variante in einem sehr einfachen konstruierten Beispiel etwas schneller:
Erstellen Sie zwei Beispieltabellen:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
Fügen Sie 10.000 Zeilen in jede Tabelle ein:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Entfernen Sie jede fünfte Zeile aus der zweiten Tabelle:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
Führen Sie die beiden SELECT
Testanweisungsvarianten durch:
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
Ausführungspläne:
Die zweite Variante muss die Filteroperation nicht ausführen, da sie den linken Antisemi- Join-Operator verwenden kann.
WHERE A.idx NOT IN (...)
ist nicht identisch aufgrund des dreiwertigen VerhaltenNULL
(dhNULL
nicht gleich istNULL
(noch ungleich), also , wenn Sie irgendwelcheNULL
intableB
unerwartete Ergebnisse erhalten!)