Là hành vi hàng rào tối ưu hóa của CTE (truy vấn VỚI) được chỉ định trong tiêu chuẩn SQL: 2008? Nếu vậy thì ở đâu?


23

Tôi thấy các tham chiếu thường xuyên đến WITHcác truy vấn (biểu thức bảng chung hoặc CTE) hoạt động như một hàng rào tối ưu hóa, trong đó máy chủ không được phép đẩy các bộ lọc xuống các truy vấn CTE, kéo các biểu thức phổ biến ra khỏi CTE, v.v. là một hành vi được yêu cầu bởi các tiêu chuẩn SQL.

CTE chắc chắn là một hàng rào tối ưu hóa trong PostgreSQL ... nhưng điều này có được yêu cầu bởi tiêu chuẩn hay thực sự chỉ là chi tiết triển khai?

Ví dụ: các bài đăng danh sách gửi thư này yêu cầu hoặc đề xuất rằng đó là tiêu chuẩn:

Sau khi đề cập đến nó trong một bình luận, tôi đã được hỏi nó được chỉ định ở đâu - và sau khi xem bản thảo duy nhất của SQL: 2008, tôi có quyền truy cập vào Tôi không gặp nhiều may mắn khi tìm thấy nó.

Tôi chưa nghiên cứu sâu về tiêu chuẩn này, vì vậy tôi hy vọng có một gợi ý từ ai đó: Có phải hàng rào tối ưu hóa của CTE trong PostgreQuery có thực sự được yêu cầu bởi tiêu chuẩn không? Và nếu vậy, nó được chỉ định ở đâu? Hoặc là các tuyên bố trong danh sách gửi thư PG bị lỗi?

Xem thêm hàng rào tối ưu hóa CTE trong danh sách việc cần làm? .

Câu trả lời:


10

Tôi nghĩ đó là một chi tiết thực hiện.

Việc triển khai tuân thủ là không bắt buộc để thực hiện chuỗi hành động chính xác được xác định trong Quy tắc chung, cung cấp hiệu ứng của nó trên dữ liệu và lược đồ SQL, trên các tham số máy chủ và biến chủ, và trên các tham số SQL và các biến SQL giống hệt với tác động của điều đó trình tự. Thuật ngữ này được sử dụng một cách hiệu quả để nhấn mạnh các hành động mà hiệu quả có thể đạt được theo những cách khác bằng cách thực hiện. 1

Tôi nghĩ rằng một người triển khai có thể đánh giá một biểu thức bảng chung 20 lần, thậm chí theo 20 cách khác nhau và vẫn có một triển khai tuân thủ. Vấn đề duy nhất có liên quan là liệu "hiệu ứng của nó có giống với hiệu ứng" của chuỗi các hành động được xác định trong các quy tắc chung hay không.

[1]. Mục 6.3.3.3, "Thứ tự đánh giá quy tắc", trong bản nháp của tiêu chuẩn SQL 2008, có tên tệp cục bộ 5CD2-01-Framework-2006-01.pdf, p. 41 Tôi không biết tôi đã lấy nó ở đâu. Google có thể biết.


2
Ý nghĩa tạm thời đó - và vì PostgreSQL sẽ cho phép sử dụng các hàm với các tác dụng phụ hoặc các câu lệnh sửa đổi dữ liệu trong CTE, nên nó phải rào lại các CTE đó. Tôi đoán điều đó có nghĩa là nó sẽ miễn phí đối với các CTE nội tuyến chỉ gọi STABLEhoặc các IMMUTABLEchức năng.
Craig Ringer

Tôi nghĩ rằng các CTE có thể ghi được chưa có trong bất kỳ tiêu chuẩn SQL nào, nhưng tôi không tích cực.
Mike Sherrill 'Nhớ lại mèo'

wCTE chắc chắn là một phần mở rộng PostgreSQL. Sẽ không rõ ràng nếu các hàm thực thi DML là vì các hàm do người dùng xác định trong SQL là SQL/PSMPG không hỗ trợ gì cả ...
Craig Ringer
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.