Tôi đang thiết lập một hệ thống giám sát cho SQL Server bằng cách sử dụng các sự kiện mở rộng để tìm các truy vấn nặng như 'phản hồi sản xuất' cho các nhà phát triển của chúng tôi. Tôi đang sử dụng các sự kiện sp_statement_completed
và sql_statement_completed
, với các bộ lọc vị trên cpu_time, logic đọc, vv Tôi đã hy vọng để tổng hợp kết quả trên database_name
và query_hash
như đã chứng minh trong rất nhiều ví dụ khắp nơi trên internet, nhưng trong kết quả tôi thấy rằng query_hash
là 0 cho tất cả các báo cáo sử dụng EXEC, như trong bảng dưới đây (dấu thời gian và truy vấn được rút ngắn để dễ đọc).
name timestamp query_hash plan_handle statement
sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm
sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid;
sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid;
sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable
sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql)
sql_statement_completed 2016...7752 0 0600f9006c23f03... exec spSetUserAuth @userid;
sql_statement_completed 2016...1443 1304...641 06005a0008a9b11... select SUBQ.ontrackstatus, COUNT(SUBQ.ontrac
Tất cả các kết quả đều có giá trị plan_handle
và chúng đều khác nhau, vì vậy rất nhiều kế hoạch đang được tạo ra. Các báo cáo khác không có query_hash
(mà tôi đã thấy) bao gồm ALTER INDEX, CHECKPOINT, CẬP NHẬT THỐNG KÊ, GIAO DỊCH CAM KẾT, TIẾP THEO TIẾP THEO TỪ con trỏ, một số CHỨNG CHỈ, CHỌN @variable, IF (@variable = x).
Có ai biết tại sao query_hash
là 0 không? Có lẽ tôi đang thiếu điểm ở đâu đó về Trình phân tích truy vấn SQL và EXEC, nhưng tôi không thể tìm thấy bất kỳ manh mối nào để chỉ cho tôi đi đúng hướng. Nếu kết quả tôi có là 'bình thường', thì làm cách nào để tổng hợp kết quả tốt nhất? Sẽ không nhóm theo câu lệnh bao gồm chữ, khoảng trắng, v.v ... được loại bỏ khi tính toán query_hash?
EDIT: như tôi thấy bây giờ, EXEC SomeStoredProcedure
bắt đầu một thủ tục được lưu trữ (hiển nhiên) và các câu lệnh riêng lẻ trong thủ tục được lưu trữ đó kết thúc trong phiên sp_statement_completed
sự kiện dưới dạng các sự kiện và tất cả đều có truy vấn_hash.
Vì vậy, đối với sp_statement_completed
(tức là các truy vấn 'thực'), tôi có thể tổng hợp trên query_hash và database_name và sql_statement_completed
không có query_hash (EXEC someStoredProcedure), tôi có thể sử dụng client_connection_id
để nhóm các câu lệnh trong một thực thi cụ thể của một thủ tục được lưu trữ, để xem những gì nhiều nhất một phần tốn kém của thủ tục.
query_hash
là 0 nhưng về lý do tại saoexec spSetUserAuth @userid;
các hàng có các thẻ điều khiển khác nhau:The algorithms to match new SQL statements to existing, unused execution plans in the cache require that all object references be fully qualified.
( Nguồn .) Nếu tất cả các mục đó là ví dụexec dbo.spSetUserAuth @userid;
, bạn có thể có các thẻ điều khiển kế hoạch giống hệt nhau cho chúng.