Có cách nào để ngăn chặn cấu trúc ghi nhớ bị cắt tỉa không?


8

Chúng tôi biết rằng cấu trúc ghi nhớ được cắt tỉa và một số kế hoạch thay thế đắt tiền bị loại bỏ trong quá trình tối ưu hóa. Tôi đã tự hỏi nếu có cách nào để ngăn chặn điều này và để cho trình tối ưu hóa chỉ xem xét mọi kế hoạch có thể và chọn phương án tốt nhất từ tất cả các phương án?


3
Nó không rõ ràng những gì bạn muốn ngăn chặn. Bạn có muốn bằng cách nào đó buộc trình tối ưu hóa tính toán chi phí cho tất cả các gói có thể (có thể là hàng nghìn tỷ, thậm chí cho một truy vấn đơn giản với 10 lần tham gia) không?
ypercubeᵀᴹ

vâng, mặc dù có vẻ như không thể Tôi muốn buộc trình tối ưu hóa xem xét tất cả các kế hoạch có thể, tính toán chi phí của họ và sau đó chọn giá rẻ nhất.
zli89

4
Và tại sao nó phải làm điều đó? Nếu nó đã tính toán, hãy nói rằng một kế hoạch có chi phí = 7, và sau đó thấy rằng bất kỳ kế hoạch nào bao gồm a hash join bsẽ có giá từ 10 trở lên, tại sao lại tính toán tất cả các kế hoạch triệu đó và không cắt tỉa chúng? (không phải là trình tối ưu hóa hoạt động theo cách đơn giản như vậy)
ypercubeᵀᴹ

Câu trả lời:


12

Chúng tôi biết rằng cấu trúc ghi nhớ được cắt tỉa và một số kế hoạch thay thế đắt tiền bị loại bỏ trong quá trình tối ưu hóa. Tôi đã tự hỏi nếu có cách nào để ngăn chặn điều này và để cho trình tối ưu hóa chỉ xem xét mọi kế hoạch có thể và chọn phương án tốt nhất từ ​​tất cả các phương án?

Có, nhưng tôi không công khai nó bởi vì nó sẽ bị hiểu lầm và áp dụng sai. Trong mọi trường hợp, nó sẽ không dẫn đến một tìm kiếm toàn diện về không gian kế hoạch vì chỉ có một bộ biến đổi giới hạn (những biến đổi thường tạo ra kết quả tốt) được thực hiện.

Ngăn chặn cắt tỉa và loại bỏ nói chung đơn giản sẽ dẫn đến (nhiều) thời gian biên dịch dài hơn mà không có nhiều cải thiện về chất lượng kế hoạch cuối cùng, nếu có.

Cuối cùng, câu hỏi là một câu hỏi tự nhiên và hợp lý, nhưng nó được xác định dựa trên sự hiểu lầm về các mục tiêu của trình tối ưu hóa truy vấn SQL Server: nó được thiết kế để tìm ra các kế hoạch tốt cho các truy vấn phổ biến một cách nhanh chóng. Nó không được xây dựng trên một khung được thiết kế để tìm kiếm toàn diện.

Nếu bạn có một tình huống trong thế giới thực sẽ được hưởng lợi từ một cách tiếp cận khác để tối ưu hóa, bạn có thể đưa ra trường hợp đó tại trang web Connect (mặc dù tôi nghĩ rằng Microsoft không thể đầu tư các tài nguyên kỹ thuật cần thiết).


9

Không có núm hoặc cờ theo dõi mà tôi biết để ép buộc hành vi này theo bất kỳ cách nào (mặc dù Paul White đề cập đến một số cờ theo dõi ở đây cung cấp khả năng hiển thị nhiều hơn và cho phép bạn dỗ một số hành vi deltas ).

Microsoft cung cấp rất nhiều vũ khí nhưng thứ này gần như sẽ được đảm bảo sẽ chỉ thẳng vào chân bạn 100% thời gian. Khi chạy truy vấn lần đầu tiên, tôi không nghĩ rằng bạn muốn SQL Server dành một lượng thời gian vô hạn để xây dựng mọi biến thể có thể có của một kế hoạch để có được kết quả mong muốn. Như @ypercube đề cập, đây có thể là rất số lượng lớn các kế hoạch và mục đích chạy các truy vấn ở tất cả sẽ loại thất bại. Mục tiêu của bạn khi chạy một truy vấn ở nơi đầu tiên, có lẽ, là trả về dữ liệu tại một số điểm, phải không? Và "một số điểm" phải nằm trong một số ngưỡng nhất định, vì các lớp nhất định trong ứng dụng của bạn sẽ có thời gian chờ truy vấn / lệnh khác nhau được thực thi và người dùng sẽ chỉ chờ quá lâu để tải trang ...

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.