Uw idee dat zij hetzelfde werk zouden moeten doen, is niet waar. Stel je deze testset met gegevens voor:
T1
ID
----
1
2
3
4
5
T2
ID
---
1
1
1
2
2
3
DDL
CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);
CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (1), (1), (2), (2), (3);
SELECT *
FROM dbo.T1
WHERE T1.ID IN (SELECT T2.ID FROM dbo.T2);
SELECT T1.*
FROM dbo.T1
INNER JOIN dbo.T2
ON T1.ID = T2.ID;
Resultaten
ID
---
1
2
3
ID
---
1
1
1
2
2
3
Uw resultaten zijn alleen hetzelfde als de kolom waarin u zoekt uniek is.
CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);
CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);
SELECT *
FROM dbo.T1
WHERE T1.ID IN (SELECT T2.ID FROM dbo.T2);
SELECT T1.*
FROM dbo.T1
INNER JOIN dbo.T2
ON T1.ID = T2.ID;
Hoewel de resultaten hetzelfde zijn, is het uitvoeringsplan dat niet. De eerste zoekopdracht met IN
kan een antisemi-join gebruiken, wat betekent dat het weet dat de gegevens in t2 niet nodig zijn, dus zodra het een enkele overeenkomst vindt, kan het stoppen met zoeken naar verdere overeenkomsten.
Als u uw tweede tabel beperkt tot alleen unieke waarden, ziet u hetzelfde plan:
CREATE TABLE dbo.T1 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);
CREATE TABLE dbo.T2 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);
SELECT *
FROM dbo.T1
WHERE T1.ID IN (SELECT T2.ID FROM dbo.T2);
SELECT T1.*
FROM dbo.T1
INNER JOIN dbo.T2
ON T1.ID = T2.ID;
Samenvattend zullen de twee zoekopdrachten niet altijd dezelfde resultaten opleveren en niet altijd hetzelfde plan hebben. Het hangt echt af van uw indexen en de breedte van uw gegevens/query.