Liên kết của Joe là một điểm khởi đầu tốt. Quassnoi cũng đề cập đến vấn đề này.
Nói chung, nếu các trường của bạn được lập chỉ mục đúng cách HOẶC nếu bạn muốn lọc ra nhiều bản ghi hơn (tức là có nhiều hàng EXIST
trong truy vấn con) NOT EXISTS
sẽ hoạt động tốt hơn.
EXIST
và NOT EXISTS
cả ngắn mạch - ngay khi bản ghi phù hợp với tiêu chí, nó được bao gồm hoặc được lọc ra và trình tối ưu hóa chuyển sang bản ghi tiếp theo.
LEFT JOIN
sẽ tham gia TẤT CẢ HỒ SƠ bất kể chúng có khớp hay không, sau đó lọc ra tất cả các bản ghi không khớp. Nếu bảng của bạn lớn và / hoặc bạn có nhiều JOIN
tiêu chí, điều này có thể rất tốn tài nguyên.
Tôi thường cố gắng sử dụng NOT EXISTS
và EXISTS
có thể ở đâu. Đối với SQL Server, IN
và NOT IN
tương đương về mặt ngữ nghĩa và có thể dễ viết hơn. Đây là một trong những toán tử duy nhất bạn sẽ tìm thấy trong SQL Server được đảm bảo ngắn mạch.