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 SELECT
variantes 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,NULL
no es igual aNULL
(ni desigual), por lo tanto, si usted tiene cualquieraNULL
detableB
obtendrá resultados inesperados!)