Truy vấn mà không có kế hoạch đủ tốt được tìm thấy


20

Tôi có cơ sở dữ liệu SQL Server 2012. Tôi nhận thấy giá trị của Reason for early termination of statement optimizationmột số truy vấn và tất cả đã cho Good Enough Plan Found. Bây giờ câu hỏi của tôi là:

  1. Tất cả các loại Lý do có thể có là gì để chấm dứt sớm tối ưu hóa tuyên bố. Tôi đã tìm kiếm cái này trong msDN nhưng không có danh sách đầy đủ các giá trị.
  2. Có DMV hoặc sự kiện mở rộng để liệt kê tất cả các truy vấn mà tối ưu hóa đã bị chấm dứt do các lý do khác với Kế hoạch đủ tốt được tìm thấy không? Tôi đã đề cập đến hai bài viết không liệt kê danh sách đầy đủ các khả năng. [Ngoài ra, họ cho tôi kết quả khác nhau trong cơ sở dữ liệu của tôi].

nhập mô tả hình ảnh ở đây


Câu trả lời:


20
  • Vượt quá giới hạn bộ nhớ

    Trình tối ưu hóa đã buộc phải ngừng tìm kiếm các giải pháp thay thế kế hoạch tốt hơn do áp lực bộ nhớ. Lý do cho điều đó nên được điều tra và sửa chữa, sau đó biên dịch truy vấn đã thử lại. Kế hoạch được trả về rất có thể không phải là kế hoạch mà trình tối ưu hóa đã chọn nếu không tồn tại điều kiện bộ nhớ thấp.

  • Hết giờ

    Lý do này là nhiều hiểu lầm .

    Trình tối ưu hóa truy vấn nhằm tìm ra một kế hoạch hợp lý một cách nhanh chóng . Nó không thực hiện tìm kiếm toàn diện để tìm ra kế hoạch tốt nhất có thể. Theo thiết kế, nó tránh dành nhiều thời gian cho việc tối ưu hóa hơn mức cần thiết. Một trong những tính năng hoạt động để đảm bảo điều này là 'hết thời gian' (không phải là thước đo thời gian).

    Trình tối ưu hóa tự đặt ra một 'ngân sách thăm dò' dựa trên mức độ phức tạp của truy vấn logic, ước tính số lượng thẻ và chi phí ước tính của gói rẻ nhất được tìm thấy cho đến nay (nếu có). Các truy vấn phức tạp hơn với số lượng thẻ cao hơn được cấp ngân sách cao hơn.

    Nếu ngân sách này bị vượt quá trong một trong các giai đoạn tìm kiếm của nó, giai đoạn kết thúc. Đây là một phần của thiết kế và hoạt động bình thường của trình tối ưu hóa. Các câu hỏi cần nhiều nỗ lực tối ưu hóa có được nó; những người không, không.

    Hãy nghĩ về 'Hết giờ' là 'Kế hoạch đủ tốt được tìm thấy'.

  • Kế hoạch đủ tốt được tìm thấy

    Điều này có nghĩa chính xác giống như một lý do trống. Nó chỉ đơn giản là một trò chơi lịch sử mà các kế hoạch có chi phí dưới 0,909090 ... (1 / 1.1) được dán nhãn theo cách này. Không có gì dừng lại sớm hoặc được xử lý đặc biệt hoặc khác trong mã tối ưu hóa khi lý do này xuất hiện.

Ngoài giới hạn bộ nhớ đã vượt quá, không có "lý do chấm dứt sớm" nào có ý nghĩa nhiều (nếu có gì cả) để điều chỉnh truy vấn hoặc phân tích hiệu suất. Tôi thường bỏ qua chúng.

Lời khuyên

Các nỗ lực điều chỉnh truy vấn mục tiêu dựa trên các số liệu hiệu suất thực (thời gian trôi qua, sử dụng CPU / bộ nhớ, ... bất cứ điều gì quan trọng trong ngữ cảnh). Nếu một truy vấn quá chậm so với mục đích của nó, hãy dành thời gian để làm cho nó nhanh hơn. Đo lường hiệu suất thực tế, so sánh nó với đường cơ sở và lịch sử và nỗ lực điều chỉnh mục tiêu ở các phương sai quan trọng.

Lưu trữ dữ liệu được bảo đảm trong một lược đồ quan hệ phù hợp, với các số liệu thống kê và chỉ mục hữu ích và các truy vấn thân thiện với trình tối ưu hóa được viết tốt.


10

Nếu bạn truy cập http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd (là liên kết bạn sẽ thấy nếu bạn mở một kế hoạch thực hiện dưới dạng xml), bạn sẽ thấy Ba lý do được liệt kê, đó là:

  • Hết giờ
  • Bộ nhớ vượt quá
  • GoodEnoughPlanFound

Các bài viết bạn đề cập có vẻ ổn để tìm những sự kiện này, bạn có gặp vấn đề cụ thể không? Điều duy nhất cần lưu ý là các DMV này không nắm bắt tất cả các lệnh SQL từng chạy trên máy chủ và được đặt lại khi máy chủ khởi động lại. Bạn có thể bẫy showplan xml với Sự kiện mở rộng và truy vấn điều đó, nhưng có vẻ như nó quá mức với tôi.

Tôi cũng sẽ không lo lắng quá nhiều về GoodEnoughPlanFound, có vẻ như trình tối ưu hóa đang thực hiện công việc của mình (tìm kiếm một kế hoạch tốt một cách nhanh chóng) khá tốt.

HTH

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.