Tại sao query_hash zero cho các câu lệnh EXEC?


8

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_completedsql_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_namequery_hashnhư đã 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_hashlà 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_handlevà 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_hashlà 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 SomeStoredProcedurebắ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_completedsự 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_completedkhô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.


2
Tôi không biết tại sao query_hashlà 0 nhưng về lý do tại sao exec 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.
Andriy M

Chúng có các plan_handles khác nhau vì chúng được sử dụng trong các cơ sở dữ liệu khác nhau, lúc đầu tôi không nhận thấy điều đó. Trong trường hợp đó, các tham chiếu đối tượng không giống nhau, do đó các kế hoạch khác nhau. Cảm ơn đã chỉ ra.
Bert Van Landeghem

Nếu đó là trường hợp sẽ không giải quyết vấn đề của bạn? Bạn có thể tạo báo cáo về hoạt động theo cơ sở dữ liệu và bạn sẽ có thể phát hiện các vấn đề đánh hơi / tham số tham số với các thủ tục nhất định.
Tom V - thử topanswers.xyz

Chà, đúng vậy ...
Bert Van Landeghem 7/10/2016

3
Nếu vấn đề tiềm ẩn của bạn đã thực sự được giải quyết, bạn có thể đăng câu trả lời giải thích những phát hiện của bạn không và làm thế nào để giải quyết vấn đề? Bạn không cần phải, nhưng nếu điều này có thể truyền cảm hứng cho bạn theo bất kỳ cách nào, đó có thể là một đóng góp có giá trị cho nền tảng kiến ​​thức của trang web này. Hãy nhớ rằng chúng tôi muốn giữ bình luận miễn là chúng giúp làm rõ câu hỏi / câu trả lời, vì vậy hãy thoải mái lặp lại bất kỳ điểm nào đã được đề cập trong các nhận xét này để sau đó chúng có thể được gỡ bỏ an toàn.
Andriy M

Câu trả lời:


1

Để giải thích tại sao hàm băm được tạo:

Khi chúng tôi gửi một truy vấn đến máy chủ, quy trình alriderizer (vâng đó là tên gọi của nó) tạo ra một hàm băm, giống như một chữ ký được mã hóa của truy vấn. Băm là một định danh duy nhất. Một mã định danh là duy nhất cho bất kỳ truy vấn nhất định, bao gồm tất cả văn bản xác định truy vấn, bao gồm cả khoảng trắng và trả về vận chuyển, trình tối ưu hóa so sánh hàm băm với các truy vấn trong bộ đệm. Nếu một truy vấn tồn tại trong bộ đệm phù hợp với truy vấn đi vào công cụ, toàn bộ chi phí của quá trình tối ưu hóa sẽ bị bỏ qua và kế hoạch thực hiện trong bộ đệm của kế hoạch được sử dụng lại.

EXECbắt đầu một thủ tục được lưu trữ có thể thay đổi mã của nó, vì SQL Server biết rằng nó không cần so sánh EXECđể tối ưu hóa nó, SQL Server không tạo ra một hàm băm.

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.