如何在 SQL Server 2016+ 中使用查询存储查找哪个程序或用户执行了查询

vCi*_*ion 6 sql-server performance monitoring sql-server-2016 sql-query-store

启用查询存储后,如何查找执行查询的人。例如,在跟踪收集的情况下,TRC 文件将获取主机名和程序详细信息以供查询,而在扩展事件的情况下,我们有 XEL 文件将获取主机名和程序详细信息。我们尝试了代码

SELECT des.program_name,
des.host_name,
*
FROM sys.query_store_query_text qt -- Query Text
JOIN sys.query_store_query q ON qt.query_text_id = q.query_id -- Query Data
JOIN sys.query_store_plan qp on qp.query_id = q.query_id --  Query Plan
join sys.dm_exec_requests der on der.query_hash = q.query_hash -- Get session id for query
join sys.dm_exec_sessions des on des.session_id = der.session_id -- Session Info
order by q.last_execution_time desc
Run Code Online (Sandbox Code Playgroud)

下面的 DMV 返回查询哈希 (query_hash) 的空值,因此上面的查询没有数据

select * from sys.dm_exec_requests der
select * from sys.dm_exec_sessions des
Run Code Online (Sandbox Code Playgroud)

小智 1

如果正确启用和配置查询存储,sys.query_store_query_text 视图应包含跟踪查询的文本。

SELECT name, is_query_store_on 
FROM sys.databases 
Run Code Online (Sandbox Code Playgroud)

SQL Server 中的查询存储会跟踪查询、查询计划和运行时统计信息,但不会维护执行这些查询的人员的记录。

查询存储有自己的系统视图,与 sys.dm_exec_requests 和 sys.dm_exec_sessions DMV 不同。它与您正在寻找的会话级详细信息没有直接关系。

您的查询尝试根据 query_hash 将查询存储视图与会话级视图(sys.dm_exec_requests、sys.dm_exec_sessions)连接起来。sys.dm_exec_requests 中的 query_hash 字段不会持久化,仅适用于当前正在执行的请求。因此,如果当前执行的请求没有与 query_hash 匹配,它将返回 null。

此外,sys.query_store_query.query_id 与 sys.query_store_query_text.query_text_id 不同,因此连接 ON qt.query_text_id = q.query_id 可能不会给您预期的结果。

如果您需要跟踪谁在执行什么查询、何时执行、从何处执行,您可能需要使用扩展事件或 SQL Server Audit,它们可以为您提供此级别的信息。

请注意,跟踪在 SQL Server 上执行的每个查询可能会导致性能下降,因为记录每个查询及其详细信息的开销会增加。

现在,您可能需要更新连接条件以正确匹配 query_text_id,例如:

SELECT des.program_name,
des.host_name,
*
FROM sys.query_store_query_text qt -- Query Text
JOIN sys.query_store_query q ON qt.query_text_id = q.query_text_id -- Query Data
JOIN sys.query_store_plan qp on qp.query_id = q.query_id --  Query Plan
join sys.dm_exec_requests der on der.query_hash = q.query_hash -- Get session id for query
join sys.dm_exec_sessions des on des.session_id = der.session_id -- Session Info
order by q.last_execution_time desc
Run Code Online (Sandbox Code Playgroud)