在查询存储中查找特定查询

MHe*_*eld 2 sql-server-2016 query-store

我在数据库上启用了查询存储。我有一个要跟踪的特定查询。我有很多关于 sp_BlitzCache 查询的详细信息(如 SQL 文本、SQL 句柄、SQL 哈希、计划缓存句柄/哈希等)。

我是否可以使用来自 sp_BlitzCache 的信息搜索查询存储以跟踪那里的查询?我想强制执行特定的执行计划,因为查询会遇到参数嗅探问题。

Pet*_*ier 10

用户界面超级不友好,但您也可以直接从“ Tracked Queries”仪表板搜索查询文本。鉴于我的垃圾数据库中只有 2 个系统查询...

select 
    query_text_id, 
    left(query_sql_text,50) as query_sql_text 
from sys.query_store_query_text
Run Code Online (Sandbox Code Playgroud)

...显示...

+---------------+----------------------------------------------------+
| query_text_id | query_sql_text                                     |
+---------------+----------------------------------------------------+
| 1             | (@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4 |
| 2             | SELECT db.name as HasMemoryOptimizedObjects from m |
+---------------+----------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

..我可以点击“追踪查询”搜索框中的“放大镜”图标...

跟踪查询输入栏上的放大镜图标

这将弹出以下输入表单...

查询文本搜索输入表单。 搜索字段周围有一个红色框。 蓝色框包围着放大镜图标。

如果您在搜索栏中输入要搜索的查询测试(屏幕截图中的红色框),然后按回车键或单击放大镜图标(蓝色框),您可以浏览查询ID、查询文本ID和查询来自内置 UI 的文本(尽管可能访问起来不友好)。

举例来说,您可以在下面的屏幕截图中看到我搜索了字母“a”并返回了两个查询...

在输入表单中搜索字母“a”

...在下一个屏幕截图中,我搜索了更具选择性的字符串“HasMemoryOptimizedObjects”,它仅返回匹配的查询文本

在输入表单中搜索字符串“HasMemoryOptimizedObjects”


Jos*_*ell 5

一种方法是直接查询查询存储视图以获取您从计划缓存中获得的信息:

SELECT 
    qsq.query_id,
    qsq.last_execution_time,
    qsqt.query_sql_text
FROM sys.query_store_query qsq
    INNER JOIN sys.query_store_query_text qsqt
        ON qsq.query_text_id = qsqt.query_text_id
WHERE
    qsqt.query_sql_text LIKE '%your query text%';
Run Code Online (Sandbox Code Playgroud)

sys.query_store_query表还有一些其他字段(query_hashlast_compile_batch_sql_handlestatement_sql_handle等),它们可能会更可靠地找到您要查找的查询。

基本上,这一点是在查询存储中找到“查询 id”,因为您需要它来找到它的计划并强制执行一个。

掌握了这些信息query_id后,您可以转到 SSMS 中的用户界面并使用“跟踪查询”节点查找查询:

跟踪查询选项卡和文本框的屏幕截图

从那里你可以点击你想要的计划,然后点击“强制计划”来强制它:

部队计划按钮的屏幕截图