Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

EXCEPT có thực thi nhanh hơn JOIN không khi các cột trong bảng giống nhau

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:

  1. Truy vấn dễ đọc hơn (điều này hầu như luôn đúng).
  2. Hiệu suất được cải thiện.

CẢ những điều sau đây là đúng:

  1. 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.
  2. 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ể.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay đổi số thứ tự của tài khoản thư cơ sở dữ liệu trong cấu hình trong SQL Server (T-SQL)

  2. Lỗi 28000:Đăng nhập không thành công cho người dùng DOMAIN \\ người dùng với pyodbc

  3. SQL Server BCP xuất tệp bị hỏng?

  4. Chèn hàng loạt chậm cho bảng có nhiều chỉ mục

  5. Có sự khác biệt nào giữa DateTime trong c # và DateTime trong máy chủ SQL không?