我正在分析支持第三方应用程序的 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 哈希 sql_handle 的值,允许它查看两个查询是否相似并因此重用相同的计划?(如果存在这样的值,那么我会分组)
我对存储过程没有这个问题,因为正在重复使用相同的计划。这只是我想组合在一起的所有类似的临时任务。
您要查找的是SQL Server 2008
query_hash
中引入的列。你可以在. 下面是查看前 20 种最常见模式的示例查询:sys.dm_exec_query_stats
另一个相关的列是
query_plan_hash
,这对于查看类似的执行计划很有用。