Đây là một câu trả lời RDBMS-bất khả tri, nhưng vẫn có thể hữu ích. Theo hiểu biết của tôi, truy vấn con tương quan (hay còn gọi là phụ thuộc) có lẽ là thủ phạm thường bị cáo buộc sai nhất vì hiệu suất kém.
Vấn đề (như nó thường được mô tả nhất) là nó xử lý truy vấn bên trong cho mọi hàng của truy vấn bên ngoài. Do đó, nếu truy vấn bên ngoài trả về 1.000 hàng và truy vấn bên trong trả về 10.000, thì truy vấn của bạn phải chuyển đổi qua 10.000.000 hàng (bên ngoài × bên trong) để tạo ra kết quả. So với 11.000 hàng (bên ngoài + bên trong) từ một truy vấn không tương quan trên các bộ kết quả giống nhau, điều đó không tốt.
Tuy nhiên, đây chỉ là trường hợp xấu nhất. Trong nhiều trường hợp, DBMS sẽ có thể khai thác các chỉ mục để giảm đáng kể số lượng hàng. Ngay cả khi chỉ truy vấn bên trong có thể sử dụng chỉ mục, 10.000 hàng sẽ trở thành ~ 13 tìm kiếm, giảm tổng số xuống 13.000.
exists
toán tử có thể ngừng xử lý các hàng sau hàng đầu tiên, giảm chi phí truy vấn hơn nữa, đặc biệt khi hầu hết các hàng bên ngoài khớp với ít nhất một hàng bên trong.
Trong một số trường hợp hiếm hoi, tôi đã thấy SQL Server 2008R2 tối ưu hóa các truy vấn con có tương quan thành một phép kết hợp (kết hợp này đi qua cả hai bộ chỉ một lần - tình huống tốt nhất có thể) nơi có thể tìm thấy chỉ mục phù hợp trong cả truy vấn bên trong và bên ngoài.
Thủ phạm thực sự cho hiệu suất kém không nhất thiết phải là truy vấn con tương quan , nhưng quét lồng nhau .