Sql-Server
將 sys.dm_exec_sql_text 中的類似查詢組合在一起
我正在分析一個支持 3rd 方應用程序的 2008 實例。
該應用程序將生成 SQL 程式碼,然後將其作為臨時查詢發送到數據庫。
我正在使用這個查詢(基於 Glenn Berry 腳本):
SELECT qs.creation_time ,qs.last_execution_time ,qs.execution_count ,qs.total_worker_time ,qs.total_physical_reads ,qs.total_logical_writes ,qs.total_logical_reads ,qs.plan_handle ,qt.text ,qt.dbid FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE qt.dbid >= 7 OPTION (RECOMPILE)
我的問題是我正在為非常相似的查詢制定數千個計劃,即
SELECT * FROM customers WHERE name = 'bob' SELECT * FROM customers WHERE name = 'bill'
(實際上查詢非常大,最多 3000 個字元)
幾乎不可能將數據轉換為適合高級分析的格式。
是否可以快速比較 2 個 SQL 查詢並查看它們是否幾乎是相同的查詢?然後,我會隨機選擇其中一個查詢,並將所有活動針對該查詢進行分組。(我試過 DIFFERENCE 但它很慢)
SQL 是否已經儲存了一個類似於 MD5 Hash sql_handle 的值,允許它查看兩個查詢是否相似並因此重用相同的計劃?(如果存在這樣的值,那麼我會對此進行分組)
我對儲存過程沒有這個問題,因為正在重用相同的計劃。這只是我想將所有類似的臨時組合在一起。
您要查找的是SQL Server 2008
query_hash
中引入的列。您可以在. 以下是查看前 20 種最常見模式的範例查詢:sys.dm_exec_query_stats
WITH agg AS ( SELECT TOP 20 COUNT(*) AS similar_query_count, query_hash FROM sys.dm_exec_query_stats qs GROUP BY qs.query_hash ORDER BY similar_query_count DESC ) SELECT similar_query_count, SUBSTRING(st.text, (ca.statement_start_offset/2) + 1, ((CASE ca.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE ca.statement_end_offset END - ca.statement_start_offset)/2) + 1 ) AS statement_text ,st.text AS full_text FROM agg CROSS APPLY (SELECT TOP 1 sql_handle, statement_start_offset, statement_end_offset FROM sys.dm_exec_query_stats WHERE query_hash = agg.query_hash) ca CROSS APPLY sys.dm_exec_sql_text(ca.sql_handle) st
另一個相關的列是
query_plan_hash
,它對於查看類似的執行計劃很有用。