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:
- Câu hỏi đầu tiên là
SELECT
truy 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 :). - 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 RECOMPILE
khô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?