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

Tại sao CTE (Biểu thức bảng chung) trong một số trường hợp làm chậm các truy vấn so với bảng tạm thời trong SQL Server

Đáp án đơn giản.

SQL Server không hiện thực hóa CTE. Nó nội tuyến chúng, như bạn có thể thấy từ các kế hoạch thực hiện.

Các DBMS khác có thể triển khai nó theo cách khác, một ví dụ nổi tiếng là Postgres, nó hiện thực hóa các CTE (về cơ bản nó tạo ra các bảng tạm thời cho các CTE đằng sau màn che).

Việc xác định rõ ràng các kết quả trung gian trong các bảng tạm thời rõ ràng có nhanh hơn hay không, tùy thuộc vào truy vấn.

Trong các truy vấn phức tạp, chi phí ghi và đọc dữ liệu trung gian vào các bảng tạm thời có thể được bù đắp bằng các kế hoạch thực thi đơn giản hiệu quả hơn mà trình tối ưu hóa có thể tạo ra.

Mặt khác, trong Postgres CTE là một "hàng rào tối ưu hóa" và công cụ không thể đẩy các vị từ qua ranh giới CTE.

Đôi khi một cách tốt hơn, đôi khi một cách khác. Một khi độ phức tạp của truy vấn phát triển vượt quá ngưỡng nhất định, trình tối ưu hóa không thể phân tích tất cả các cách có thể để xử lý dữ liệu và nó phải giải quyết vấn đề nào đó. Ví dụ, thứ tự tham gia các bảng. Số lượng các hoán vị tăng lên theo cấp số nhân với số lượng bảng để lựa chọn. Trình tối ưu hóa có thời gian giới hạn để tạo một kế hoạch, vì vậy nó có thể đưa ra một lựa chọn không tốt khi tất cả các CTE đều nằm trong dòng. Khi chia thủ công truy vấn phức tạp thành những truy vấn đơn giản hơn, bạn cần hiểu rõ mình đang làm gì, nhưng trình tối ưu hóa có cơ hội tốt hơn để tạo một kế hoạch tốt cho từng truy vấn đơn giản.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt về hiệu suất chính giữa kiểu dữ liệu SQL Server varchar và nvarchar là gì?

  2. Làm cách nào để chuyển một biến có chứa danh sách vào một truy vấn SQL động?

  3. SQL Server 2008:Thay đổi kiểu dữ liệu hàng loạt

  4. Làm thế nào để tạo tệp cơ sở dữ liệu SQL 2008 nhúng nếu nó không tồn tại?

  5. Trích xuất giá trị số đầu tiên từ chuỗi sql