La mayor diferencia no está en la combinación vs no existe, es (como está escrito), el SELECT *.
En el primer ejemplo, obtienes todas las columnas de ambos A y B, mientras que en el segundo ejemplo, obtienes solo columnas de A.
En SQL Server, la segunda variante es ligeramente más rápida en un ejemplo artificial muy simple:
Crea dos tablas de muestra:
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
Inserte 10,000 filas en cada tabla:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Eliminar cada quinta fila de la segunda tabla:
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;
Realice las dos SELECTvariantes de declaración de prueba :
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);
Planes de ejecución:

La segunda variante no necesita realizar la operación de filtro ya que puede usar el operador izquierdo anti-semi-unión.
WHERE A.idx NOT IN (...)es no idéntica , debido al comportamiento de trivalenteNULL(es decir,NULLno es igual aNULL(ni desigual), por lo tanto, si usted tiene cualquieraNULLdetableBobtendrá resultados inesperados!)