Sự khác biệt lớn nhất không nằm ở sự tham gia so với không tồn tại, đó là (như được viết) , SELECT *
.
Trong ví dụ đầu tiên, bạn nhận được tất cả các cột từ cả hai A
và B
trong khi trong ví dụ thứ hai, bạn chỉ nhận được các cột từ đó A
.
Trong SQL Server, biến thể thứ hai nhanh hơn một chút trong một ví dụ giả định rất đơn giản:
Tạo hai bảng mẫu:
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
Chèn 10.000 hàng vào mỗi bảng:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Xóa mọi hàng thứ 5 khỏi bảng thứ hai:
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;
Thực hiện hai SELECT
biến thể tuyên bố thử nghiệm :
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);
Kế hoạch thực hiện:
Biến thể thứ hai không cần thực hiện thao tác lọc vì nó có thể sử dụng toán tử chống bán nối trái.
WHERE A.idx NOT IN (...)
là không giống nhau do các hành vi trivalent củaNULL
(tứcNULL
là không bằngNULL
(và cũng không bất bình đẳng), do đó nếu bạn có bất kỳNULL
trongtableB
bạn sẽ nhận được kết quả bất ngờ!)