Tôi có đúng không khi nói rằng số liệu thống kê chỉ được sử dụng khi tạo kế hoạch thực hiện cho một thủ tục được lưu trữ và chúng không được sử dụng trong bối cảnh thực thi thực tế?
Không, điều xảy ra là kế hoạch thực hiện cho một thủ tục được lưu trữ được lưu trữ. Giả sử có đủ bộ nhớ khả dụng để tiếp tục giữ kế hoạch, nó sẽ không thay đổi trừ khi một trong những điều sau đây xảy ra (từ Bộ nhớ đệm và sử dụng lại kế hoạch thực hiện trong tài liệu SQL Server, nhấn mạnh thêm):
- Các thay đổi được thực hiện đối với bảng hoặc dạng xem được tham chiếu bởi truy vấn (ALTER TABLE và ALTER VIEW).
- Các thay đổi được thực hiện cho một thủ tục duy nhất sẽ loại bỏ tất cả các kế hoạch cho thủ tục đó khỏi bộ đệm (THỦ TỤC THAY ĐỔI).
- Thay đổi đối với bất kỳ chỉ mục được sử dụng bởi kế hoạch thực hiện.
- Cập nhật về số liệu thống kê được sử dụng bởi kế hoạch thực hiện, được tạo rõ ràng từ một câu lệnh, chẳng hạn như CẬP NHẬT THỐNG KÊ, hoặc được tạo tự động.
- Bỏ một chỉ số được sử dụng bởi kế hoạch thực hiện.
- Một cuộc gọi rõ ràng đến sp_recompile.
- Số lượng lớn các thay đổi đối với các khóa (được tạo bởi các câu lệnh INSERT hoặc DELETE từ những người dùng khác sửa đổi bảng được tham chiếu bởi truy vấn).
- Đối với các bảng có kích hoạt, nếu số lượng hàng trong các bảng được chèn hoặc xóa tăng lên đáng kể.
- Thực hiện một thủ tục được lưu trữ bằng cách sử dụng tùy chọn VỚI RECOMPILE.
Vì vậy, nếu số liệu thống kê được cập nhật, kế hoạch lưu trữ sẽ tự động đưa số liệu thống kê mới vào tài khoản và được biên dịch lại.
Làm thế nào để bạn ngăn chặn các kế hoạch thực hiện tăng trưởng cũ khi bạn có một trăm ngàn hàng được thêm vào một ngày?
Một cách là nếu có rất nhiều cập nhật cho bảng, như đã đề cập ở trên. Một vài trăm ngàn hàng thay đổi có thể đáp ứng điều kiện này. Nhưng nếu bạn muốn chắc chắn hoặc có quyền kiểm soát chi tiết hơn: bằng cách cập nhật số liệu thống kê của bạn. Bạn có thể cho phép SQL Server tự động tạo và quản lý số liệu thống kê hoặc tự làm điều đó. Bạn có thể tìm thêm thông tin về một trong hai phương pháp tại SQL Server Auto Update và Auto Tạo tùy chọn thống kê . Khi / nếu bạn thực hiện xây dựng lại các chỉ mục hàng tuần, điều này cũng sẽ kích hoạt các kế hoạch cũng được cập nhật. Thực hiện một số thử nghiệm để xem điều gì có lợi nhất cho bạn, vì việc cập nhật số liệu thống kê quá thường xuyên có thể không mang lại bất kỳ kết quả hiệu suất thực sự nào.
Nếu chúng tôi cập nhật số liệu thống kê thường xuyên để chống lại vấn đề này, liệu có nên sử dụng gợi ý TÙY CHỌN (RECOMPILE) cho truy vấn của thủ tục được lưu trữ này không?
Bạn không cần sử dụng RECOMPILE
, vì dựa vào đoạn trích ở trên, bạn có thể thấy rằng kế hoạch thực hiện được cập nhật một cách thích hợp bất cứ khi nào có số liệu thống kê mới. Bạn có thể ổn với cập nhật thống kê cuối ngày (nếu bạn thực sự quan tâm) nhưng tôi không nghĩ đó rõ ràng là một nhu cầu dựa trên những gì bạn đã nói cho đến nay. Tuy nhiên, một lần nữa, tôi sẽ kiểm tra nó để xem điều gì có thể ảnh hưởng đến hiệu suất thủ tục được lưu trữ của bạn và lên kế hoạch phù hợp.
RECOMPILE
Sẽ không gây ra cập nhật số liệu nào.