我们在我们的环境中使用 SQL Spotlight。这很方便。我们特别使用 sys.dm_exec_requests 和 sys.dm_exec_query_stats 的输出。
Spotlight 使用很好的散列从计划缓存中为您提取查询计划。
问题是,除非您对代码库有经验,否则很难知道该查询来自何处。
我有一个想法,如果可以的话:
- 解析代码库
- 拉取 SQL 查询
- 以与微软相同的方式散列它们
通过这种方式,我可以对哈希进行快速匹配,以便能够查看代码库中特定查询的来源。
或者我必须做一些非常慢的正则表达式......
不,Microsoft 不会发布散列算法。此外,散列发生在与原始查询文本不同的层 - 所以即使你有算法,你仍然需要首先像 SQL Server 那样进行规范化。
这假设也没有动态 sql、SMO 等,其中没有实际的纯文本查询。
听起来您想要做的就是获取与 dm_exec_requests/dm_exec_query_stats 中的查询对应的语句文本?
您可以通过以下方式使用
APPLY
该sys.dm_exec_sql_text()
功能:sql_handle
聚会迟到了,但我确实有一个解决方法。肖恩是正确的,微软没有发布散列算法,并且首先发生了一些规范化(例如,如果您在查询文本中插入换行符,则查询散列不变)。
如果您有权访问 SQL Server 实例,则可以找到查询哈希。在不运行查询的情况下最快的方法是通过估计的计划:
这将返回显示计划 xml,其中包含查询哈希和查询计划哈希。在此示例中,它位于
<StmtSimple>
标签中。QueryHash="0x6BDE57303A0617E2"
QueryPlanHash="0x3A7F77E18FC7FA01"