为什么 sys.query_store_query_text 不返回我的查询?

nam*_*nam 3 sql-server sql-server-2019

AdventureWorks2019数据库查询

SELECT * FROM HumanResources.Department D INNER JOIN HumanResources.EmployeeDepartmentHistory E ON D.DepartmentID = E.DepartmentID
Run Code Online (Sandbox Code Playgroud)

问题:为什么以下查询没有返回任何数据。我期望它为我的上述测试查询返回至少一行。我在这里可能遗漏或误解了什么?

select 
    query_text_id, 
    query_sql_text as query_sql_text 
from sys.query_store_query_text where query_sql_text like '%SELECT * FROM HumanResources.Department D INNER JOIN HumanResources.EmployeeDepartmentHistory E ON D.DepartmentID = E.DepartmentID%'
Run Code Online (Sandbox Code Playgroud)

参考:sys.query_store_query_text

查询存储在默认配置下打开。

Zik*_*ato 8

1.查询存储未开启

你可以去sys.databasesDMV查一下。

SELECT
    d.name
    , d.is_query_store_on
FROM sys.databases AS d
WHERE d.database_id = DB_ID()
Run Code Online (Sandbox Code Playgroud)

2. 查询存储是只读的

在相关数据库的上下文中运行以下查询。应该actual_state_descREAD_WRITE并且readonly_reason = 0

SELECT
    dqso.desired_state_desc
    , dqso.actual_state_desc
    , dqso.readonly_reason
    , dqso.query_capture_mode_desc
FROM sys.database_query_store_options AS dqso
Run Code Online (Sandbox Code Playgroud)

3.查询存储没问题,但是查询没有通过阈值

QS 的默认设置Query_Capture_Mode“自动”我在我的博客上详细介绍了查询存储默认设置。简而言之,查询必须至少符合这些条件之一才能保存。

  • 执行30次
  • 或者总编译 CPU 时间需要 > 1 秒
  • 或者总执行 CPU 时间需要 > 100ms

全部在 24 小时内(默认)。

您可以将捕获模式更改为ALL或符合上述条件。

4.查询存储没问题,查询通过了阈值,但是过滤器错误

您尝试查找的查询文本中可能存在拼写错误。或者空白不匹配。或者您会找到刚刚用于查找查询的查询。尝试搜索最小但不同的值。

另一种选择是从估计或实际计划中获取查询哈希(这是来自另一篇博客文章的指南),然后通过确切的查询哈希搜索查询存储。

例子:

SELECT 
    qsq.query_id
    , qsq.query_hash
    , qsqt.query_sql_text
FROM sys.query_store_query AS qsq
JOIN sys.query_store_query_text AS qsqt
    ON qsqt.query_text_id = qsq.query_text_id
WHERE qsq.query_hash = 0x52272BBBB4DF6B47 -- use your query hash
Run Code Online (Sandbox Code Playgroud)