Microsoft 是否发布其 SQL 查询哈希算法..?

g0p*_*her 6 sql-server hashing

我们在我们的环境中使用 SQL Spotlight。它很方便。我们特别使用 sys.dm_exec_requests 和 sys.dm_exec_query_stats 的输出。

Spotlight 使用很好的散列从计划缓存中为您提取查询计划。

问题是,除非您对代码库有经验,否则很难知道该查询来自何处。

我有一个想法,如果我可以:

  • 解析代码库
  • 拉取 SQL 查询
  • 以与微软相同的方式散列它们

通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。

或者我必须做一些非常慢的正则表达式......

Sea*_*ser 6

Microsoft 是否发布其 SQL 查询哈希算法..?

不,Microsoft 不会发布散列算法。此外,散列发生在与原始查询文本不同的层 - 所以即使你有算法,你仍然需要像 SQL Server 一样首先进行规范化。

通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。

这假设也没有像动态 sql、SMO 等这样的东西,其中没有实际的纯文本查询。


Mar*_*son 5

听起来您想要做的就是获取与 dm_exec_requests/dm_exec_query_stats 中的查询对应的语句文本?

您可以通过以下方式使用APPLYsys.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)