CREATE TABLE #Superset
(
ID INT PRIMARY KEY CLUSTERED,
Rnd INT
)
INSERT #Superset
(
ID,
Rnd
)
SELECT v1.Number + 100 * v2.Number AS ID,
ABS(CHECKSUM(NEWID())) AS Rnd
FROM master..spt_values AS v1
INNER JOIN master..spt_values AS v2 ON v2.Type = 'P'
AND v2.Number BETWEEN 0 AND 29
WHERE v1.Type = 'P'
AND v1.Number BETWEEN 1 AND 100
ORDER BY v1.Number + 100 * v2.Number
CREATE TABLE #Subset
(
UserID INT,
ID INT,
PRIMARY KEY CLUSTERED
(
UserID,
ID
)
)
-- Run this statement until no primary key error occur
INSERT #Subset
(
UserID,
ID
)
SELECT v1.Number AS UserID,
ABS(CHECKSUM(NEWID())) % 3000 AS ID
FROM master..spt_values AS v1
INNER JOIN master..spt_values AS v2 ON v2.Type = 'P'
AND v2.Number BETWEEN 0 AND 9
WHERE v1.Type = 'P'
AND v1.Number BETWEEN 1 AND 100
ORDER BY v1.Number,
2
-- Join method
SELECT a.ID,
a.Rnd
FROM #Superset AS a
INNER JOIN #Subset AS b ON b.ID = a.ID
WHERE b.UserID = 55
-- IN method
SELECT a.ID,
a.Rnd
FROM #Superset AS a
WHERE a.ID IN (SELECT b.ID FROM #Subset AS b WHERE b.UserID = 55 AND b.ID = a.ID)
DROP TABLE #Superset,
#Subset
Execution plans are the followingINNER JOIN method
|--Nested Loops(Inner Join, OUTER REFERENCES:([b].[ID]))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#Subset] AS [b]), SEEK:([b].[UserID]=(55)) ORDERED FORWARD)
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#Superset] AS [a]), SEEK:([a].[ID]=[tempdb].[dbo].[#Subset].[ID] as [b].[ID]) ORDERED FORWARD)
IN method
|--Merge Join(Right Semi Join, MERGE:([b].[ID])=([a].[ID]), RESIDUAL:([tempdb].[dbo].[#Subset].[ID] as [b].[ID]=[tempdb].[dbo].[#Superset].[ID] as [a].[ID] AND [tempdb].[dbo].[#Subset].[ID] as [b].[ID]=[tempdb].[dbo].[#Superset].[ID] as [a].[ID]))
|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#Subset] AS [b]), SEEK:([b].[UserID]=(55)) ORDERED FORWARD)
|--Clustered Index Scan(OBJECT:([tempdb].[dbo].[#Superset] AS [a]), ORDERED FORWARD)SQL Profiler results are the followingINNER JOIN method
Reads 22
Parse & compile 1 ms
Execution 0 ms
IN method
Reads 11
Parse & compile 9 ms
Execution 1 ms
E 12°55'05.63"
N 56°04'39.26"