Sql-Server

將 sys.dm_exec_sql_text 中的類似查詢組合在一起

  • August 7, 2018

我正在分析一個支持 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 2008query_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,它對於查看類似的執行計劃很有用。

引用自:https://dba.stackexchange.com/questions/214280