Quy tắc nào xác định khi máy chủ SQL sử dụng CTE làm hàng rào tối ưu hóa trên mạng?


10

Một thời gian trước, Brent Ozar đã xuất bản một bài viết chi tiết một số khác biệt giữa SQL Server và PostgreQuery:

Hai điểm khác biệt quan trọng giữa SQL Server và PostgreSQL

Điểm đầu tiên (các CTE của Tối cao là hàng rào tối ưu hóa) bắt gặp tôi, vì rõ ràng trong ví dụ được cung cấp, SQL Server kết hợp CTE và truy vấn chính với nhau và tối ưu hóa nó như một truy vấn duy nhất (trái ngược với hành vi ngược lại trong PostgreSQL).

Tuy nhiên, hành vi này dường như trái ngược với các ví dụ mà tôi đã thấy trong các blog và lớp đào tạo khác, nơi SQL Server coi CTE là hàng rào tối ưu hóa, cho phép sử dụng chỉ mục tốt hơn, hiệu suất tốt hơn, v.v. Ví dụ:

Cách tốt hơn để chọn sao

Vì vậy, có vẻ như SQL Server trực tiếp tôn vinh CTE như một hàng rào tối ưu hóa SOMETIMES. Có tài nguyên tốt nào có sẵn để ghi lại danh sách cụ thể các trường hợp đã biết trong đó SQL Server sẽ tôn vinh CTE một cách đáng tin cậy như một hàng rào tối ưu hóa (hoặc hành vi ngược lại) không?

Câu trả lời:


10

... danh sách các trường hợp đã biết trong đó SQL Server sẽ tôn vinh CTE một cách đáng tin cậy như một hàng rào tối ưu hóa

Bất kỳ danh sách như vậy sẽ dựa trên hành vi quan sát, không đảm bảo độ tin cậy.

Các truy vấn tối ưu hóa SQL Server không bao giờ đối xử với một biểu thức bảng chung như một hàng rào tối ưu hóa cho mỗi gia nhập , mặc dù một số công trình xây dựng rõ ràng là khó có thể tối ưu hóa trên. CTE đệ quy là một ví dụ tốt về điều này.

CTE được xử lý rất giống với các khung nhìn / hàm nội tuyến / truy vấn con / bảng dẫn xuất và được đưa vào truy vấn. Bất kỳ hành vi 'hàng rào' quan sát nào đều phụ thuộc vào trình tối ưu hóa hoặc không thể hoặc quyết định không tối ưu hóa qua đường viền thấm theo nguyên tắc đó.

Nói chung, CTE càng đơn giản và 'quan hệ' thì càng có nhiều khả năng trình tối ưu hóa sẽ có thể di chuyển các bit xung quanh.

Các tính năng cho phép trình tối ưu hóa xem xét hoặc buộc nó hiện thực hóa 'kết quả' của CTE đã được đề xuất, nhưng chưa được triển khai:

Trong khi đó, cách giải quyết phổ biến nhất là cụ thể hóa rõ ràng kết quả trung gian được đặt trong một bảng tạm thời hoặc biến bảng. Điều này rõ ràng đòi hỏi một kịch bản không giới hạn trong một tuyên bố duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.