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.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)
在相关数据库的上下文中运行以下查询。应该actual_state_desc是READ_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)
QS 的默认设置Query_Capture_Mode为“自动”。我在我的博客上详细介绍了查询存储默认设置。简而言之,查询必须至少符合这些条件之一才能保存。
全部在 24 小时内(默认)。
您可以将捕获模式更改为ALL或符合上述条件。
您尝试查找的查询文本中可能存在拼写错误。或者空白不匹配。或者您会找到刚刚用于查找查询的查询。尝试搜索最小但不同的值。
另一种选择是从估计或实际计划中获取查询哈希(这是来自另一篇博客文章的指南),然后通过确切的查询哈希搜索查询存储。
例子:
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)