Sự khác biệt lớn về thời gian thực hiện giữa các truy vấn khi sử dụng gợi ý truy vấn RECOMPILE


16

Tôi có hai truy vấn gần như giống hệt nhau đang chạy trên cùng một phiên bản SQL Server 2005:

  1. Câu hỏi đầu tiên là SELECTtruy vấn ban đầu do LINQ tạo ra (Tôi biết, tôi biết ... Tôi không phải là nhà phát triển ứng dụng, chỉ là DBA :).
  2. Cái thứ hai hoàn toàn giống với cái thứ nhất, được thêm OPTION (RECOMPILE)vào cuối.

Không có gì khác đã được thay đổi.

Cái đầu tiên mất 55 giây mỗi lần chạy.
Cái thứ hai mất 2 giây.

Cả hai bộ kết quả là giống hệt nhau.

Tại sao gợi ý này sẽ tạo ra một mức tăng đáng kể trong hiệu suất?

Mục nhập Sách trực tuyến trên RECOMPILEkhông cung cấp giải thích chi tiết:

Hướng dẫn Công cụ cơ sở dữ liệu SQL Server loại bỏ kế hoạch được tạo cho truy vấn sau khi thực hiện, buộc trình tối ưu hóa truy vấn phải biên dịch lại kế hoạch truy vấn vào lần tiếp theo thực hiện cùng một truy vấn. Không chỉ định RECOMPILE, Cơ sở dữ liệu lưu trữ các kế hoạch truy vấn và sử dụng lại chúng. Khi biên dịch các gói truy vấn, gợi ý truy vấn RECOMPILE sử dụng các giá trị hiện tại của bất kỳ biến cục bộ nào trong truy vấn và, nếu truy vấn nằm trong một thủ tục được lưu trữ, các giá trị hiện tại được truyền cho bất kỳ tham số nào.

RECOMPILE là một thay thế hữu ích để tạo một thủ tục được lưu trữ sử dụng mệnh đề VỚI RECOMPILE khi chỉ một tập hợp các truy vấn bên trong thủ tục được lưu trữ, thay vì toàn bộ thủ tục được lưu trữ, phải được biên dịch lại. Để biết thêm thông tin, xem Biên dịch lại thủ tục lưu trữ. RECOMPILE cũng hữu ích khi bạn tạo hướng dẫn kế hoạch. Để biết thêm thông tin, hãy xem Tối ưu hóa các truy vấn trong các ứng dụng đã triển khai bằng cách sử dụng Hướng dẫn kế hoạch.

Vì truy vấn của tôi có rất nhiều biến cục bộ, nên tôi đoán là SQL Server có thể (nghiêm túc) tối ưu hóa nó khi tôi sử dụng OPTION (RECOMPILE)gợi ý truy vấn.

Ở mọi nơi tôi nhìn mọi người đang nói rằng OPTION (RECOMPILE)nên tránh. Giải thích cho điều này nói chung là việc sử dụng gợi ý SQL Server này không thể sử dụng lại kế hoạch ngoại lệ này và do đó phải lãng phí thời gian để biên dịch lại nó mọi lúc.
(Nhưng) Với lợi thế hiệu suất khổng lồ, tôi có xu hướng nghĩ rằng sử dụng gợi ý truy vấn này lần này sẽ là một điều tốt.

Tôi có nên sử dụng nó? Nếu không, có cách nào để tôi có thể buộc SQL Server sử dụng một kế hoạch thực hiện tốt hơn mà không cần gợi ý này và không làm thay đổi ứng dụng không?

Câu trả lời:


16

Như tài liệu trong bài viết Thống kê được sử dụng bởi Trình tối ưu hóa truy vấn trong Microsoft SQL Server 2005

Nếu bạn sử dụng một biến cục bộ trong một vị từ truy vấn thay vì một tham số hoặc bằng chữ, trình tối ưu hóa sẽ sử dụng ước tính chất lượng giảm hoặc dự đoán tính chọn lọc của vị từ. Sử dụng tham số hoặc bằng chữ trong truy vấn thay vì biến cục bộ

Khi trình tối ưu hóa hoàn toàn không có số liệu thống kê có thể sử dụng cho một cột, nó sẽ đoán rằng một =vị từ sẽ khớp với 10% hàng, BETWEEN9% và bất kỳ số nào >, >=, < and <=sẽ khớp 30%. Nếu có số liệu thống kê cột có sẵn, một =vị từ sẽ được xử lý khác nhau như dưới đây.

Ngay cả khi các biến cục bộ được sử dụng trong truy vấn, ước tính tốt hơn dự đoán được sử dụng trong trường hợp các biến vị ngữ bằng. Độ chọn lọc cho các điều kiện của biểu mẫu " @local_variable = column_name" được ước tính bằng cách sử dụng tần số giá trị trung bình từ biểu đồ cho cột_name. Vì vậy, ví dụ, nếu cột tên_bảng chứa tất cả các giá trị duy nhất, thì ước tính chọn lọc 1/(number of unique values in column)sẽ được sử dụng, đó là chính xác.

Vì vậy, điều này về cơ bản giống như sử dụng cho OPTIMIZE FOR (UNKNOWN). Nó có thể chính xác hơn so với 10%dự đoán cố định nhưng nó không phù hợp với các giá trị cụ thể mà bạn đang truy vấn.

Để buộc SQL Server tối ưu hóa truy vấn mỗi khi nó chạy và sử dụng các giá trị của các biến cục bộ để ước tính giá trị và chi phí trong quá trình tối ưu hóa truy vấn, hãy thêm RECOMPILEgợi ý truy vấn vào truy vấn.

Với việc sử dụng RECOMPILEbạn có lẽ đang nhận được ước tính chính xác hơn về thẻ và do đó, một kế hoạch khác với các loại lệnh tham gia / loại tham gia phù hợp hơn với số lượng hàng được trả về từ các phần khác nhau của truy vấn thực tế của bạn.

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.