Có thể cung cấp cho trình tối ưu hóa nhiều hơn hoặc tất cả thời gian nó cần?


18

Cho rằng trình tối ưu hóa không thể mất toàn bộ thời gian cần thiết (nó phải giảm thiểu thời gian thực hiện và không đóng góp cho nó) để khám phá tất cả các kế hoạch thực hiện có thể mà đôi khi nó bị cắt.

Tôi đã tự hỏi nếu điều này có thể được ghi đè để bạn có thể cung cấp trình tối ưu hóa mọi lúc trong nhu cầu (hoặc một lượng mili giây nhất định).

Tôi không có nhu cầu này (atm) nhưng tôi có thể tưởng tượng ra một kịch bản trong đó một truy vấn phức tạp được thực hiện trong một vòng lặp chặt chẽ và bạn muốn đưa ra kế hoạch tối ưu và lưu trữ nó trước khi xử lý.

Tất nhiên, bạn có một vòng lặp chặt chẽ, bạn nên viết lại truy vấn để nó biến mất nhưng hãy chịu đựng tôi.

Đây không chỉ là một câu hỏi vì tò mò và cũng để xem liệu đôi khi có sự khác biệt giữa tối ưu hóa ngắn mạch và đầy đủ hay không.

Hóa ra bạn có thể cung cấp cho trình tối ưu hóa nhiều thời gian hơn với cờ theo dõi 2301. Nó không chính xác như những gì tôi đã hỏi nhưng nó lại gần.

Thông tin tốt nhất tôi tìm thấy về điều này là trong Phần mở rộng mô hình bộ xử lý truy vấn trong SQL Server 2005 SP1 của Ian Jose.

Sử dụng cờ dấu vết này một cách cẩn thận! Nhưng nó có thể hữu ích khi đưa ra các kế hoạch tốt hơn. Xem thêm:

Tôi đã suy nghĩ về các truy vấn có rất nhiều phép nối trong đó không gian giải pháp cho thứ tự nối phát nổ theo cấp số nhân. Các heuristic mà SQL Server sử dụng là khá tốt nhưng tôi đã tự hỏi liệu trình tối ưu hóa sẽ đề xuất một thứ tự khác nếu nó có nhiều thời gian hơn (trong khoảng vài giây hoặc thậm chí là vài phút).

Câu trả lời:


16

Bên cạnh cờ theo dõi 2301, có 8780 thực sự làm cho trình tối ưu hóa 'làm việc chăm chỉ hơn' vì nó chỉ cho nó nhiều thời gian hơn (không giới hạn, như được mô tả chi tiết ở đây (tiếng Nga) và ít chi tiết hơn ở đây ) để làm việc của nó.

Mô tả chi tiết bằng tiếng Anh của tác giả gốc của bài báo tiếng Nga. trong đó bao gồm cảnh báo riêng của tác giả:

nó không được khuyến khích sử dụng nó trong sản xuất .

Kết hợp cả hai và áp dụng chúng (rất chọn lọc thông qua gợi ý truy vấn TÙY CHỌN (QUERYTRACEON 2301, QUERYTRACEON 8780) cho truy vấn của các TVF nội tuyến lồng nhau 4 cấp (trong đó chỉ có một ở phía dưới sẽ thực hiện bất kỳ công việc thực tế nào và các cấp trên sẽ tương quan với kết quả thông qua các truy vấn con của EXISTS) đã tạo ra một MERGE THAM GIA tuyệt vời và một số trường học LAZY đã cắt giảm một nửa thời gian thực hiện.


4

Không, bạn không thể.

Bạn có thể làm cho các truy vấn của mình "thân thiện với trình tối ưu hóa" bằng cách hiểu cách thức hoạt động của nó (con thú phức tạp, không cần thiết phải biết từ trong ra ngoài). Tôi khuyên bạn nên làm gì đó nếu thời gian quan trọng, thì hãy sửa truy vấn thay vì thay đổi cách SQL Server hoạt động.

Ví dụ: bạn muốn biết khi nào một truy vấn bắt đầu nhân rộng ít hiệu quả hơn O (n) khi khối lượng dữ liệu + phân phối dữ liệu thay đổi: dành nhiều thời gian hơn cho trình tối ưu hóa không thêm giá trị ở đây.

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.