g0p*_*her 6 sql-server hashing
我们在我们的环境中使用 SQL Spotlight。它很方便。我们特别使用 sys.dm_exec_requests 和 sys.dm_exec_query_stats 的输出。
Spotlight 使用很好的散列从计划缓存中为您提取查询计划。
问题是,除非您对代码库有经验,否则很难知道该查询来自何处。
我有一个想法,如果我可以:
通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。
或者我必须做一些非常慢的正则表达式......
Microsoft 是否发布其 SQL 查询哈希算法..?
不,Microsoft 不会发布散列算法。此外,散列发生在与原始查询文本不同的层 - 所以即使你有算法,你仍然需要像 SQL Server 一样首先进行规范化。
通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。
这假设也没有像动态 sql、SMO 等这样的东西,其中没有实际的纯文本查询。
听起来您想要做的就是获取与 dm_exec_requests/dm_exec_query_stats 中的查询对应的语句文本?
您可以通过以下方式使用APPLY该sys.dm_exec_sql_text()功能sql_handle:
SELECT
deqs.plan_handle AS PlanHandle
,deqs.query_hash AS QueryHash
,Q.statementtext AS StatementText
,deqs.query_plan_hash AS QueryPlanHash
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
CROSS APPLY (VALUES (SUBSTRING(dest.text, (deqs.statement_start_offset/2)+1,
((CASE deqs.statement_end_offset WHEN -1 THEN DATALENGTH(dest.text)
ELSE deqs.statement_end_offset
END - deqs.statement_start_offset)/2)+1))) AS Q(statementtext)
Run Code Online (Sandbox Code Playgroud)