Không ai có thể nói với bạn rằng EXCEPT
sẽ luôn luôn hoặc không bao giờ thực hiện một OUTER JOIN
tương đương . Trình tối ưu hóa sẽ chọn một kế hoạch thực thi thích hợp bất kể bạn viết ý định của mình như thế nào.
Điều đó nói rằng, đây là phương châm của tôi:
Sử dụng EXCEPT
khi ít nhất một điều nào sau đây là đúng:
- Truy vấn dễ đọc hơn (điều này hầu như luôn đúng).
- Hiệu suất được cải thiện.
Và CẢ những điều sau đây là đúng:
- Truy vấn tạo ra các kết quả giống hệt nhau về ngữ nghĩa và bạn có thể chứng minh điều này thông qua kiểm tra hồi quy đầy đủ, bao gồm tất cả các trường hợp cạnh.
- Hiệu suất không bị suy giảm (một lần nữa, trong mọi trường hợp cạnh, cũng như các thay đổi về môi trường như xóa vùng đệm, cập nhật số liệu thống kê, xóa bộ nhớ cache của kế hoạch và khởi động lại dịch vụ).
Điều quan trọng cần lưu ý là viết một EXCEPT
tương đương có thể là một thách thức truy vấn dưới dạng JOIN
trở nên phức tạp hơn và / hoặc bạn đang dựa vào các bản sao trong một phần của các cột chứ không phải các cột khác. Viết NOT EXISTS
tương đương, mặc dù ít đọc hơn một chút so với EXCEPT
cần phải hoàn thành tầm thường hơn nhiều - và thường sẽ dẫn đến một kế hoạch tốt hơn (nhưng lưu ý rằng tôi sẽ không bao giờ nói ALWAYS
hoặc NEVER
, ngoại trừ theo cách tôi vừa làm).
Trong bài đăng trên blog này, tôi chứng minh ít nhất một trường hợp EXCEPT
hoạt động tốt hơn cả LEFT OUTER JOIN
được xây dựng đúng cách và tất nhiên bằng một NOT EXISTS
tương đương biến thể.