如果正确启用和配置查询存储,sys.query_store_query_text 视图应包含跟踪查询的文本。
SELECT name, is_query_store_on
FROM sys.databases
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