La plus grande différence ne réside pas dans la jointure ni dans la jonction, elle est (comme écrit), la SELECT *
.
Dans le premier exemple, vous obtenez toutes les colonnes des deux A
et B
, alors que dans le deuxième exemple, vous n’obtenez que des colonnes A
.
Dans SQL Server, la deuxième variante est légèrement plus rapide dans un exemple très simple:
Créez deux exemples de tables:
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
Insérer 10 000 lignes dans chaque tableau:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Supprimer tous les 5 rangs de la deuxième table:
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;
Effectuez les deux SELECT
variantes d'instruction de test :
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);
Plans d'exécution:
La deuxième variante n'a pas besoin d'effectuer l'opération de filtrage car elle peut utiliser l'opérateur anti-jointure gauche.
WHERE A.idx NOT IN (...)
est pas identique en raison du comportement trivalentNULL
(c.NULL
-à-n'est pas égal àNULL
(ni inégale), donc si vous avez uneNULL
entableB
vous obtiendrez des résultats inattendus!)