被杀死的会话是否出现在查询存储中?

ada*_*m.g 7 sql-server kill query-store

是否有任何选项可以在查询存储中查看已终止的会话?

我这么问是因为我们有一个附加工具,如果会话运行时间超过 30 分钟(KILL命令),它就会终止会话。

我想检查查询存储中已终止查询的执行计划。我在查询存储中找不到被这个附加应用程序杀死的会话/查询。

Zik*_*ato 8

他们不这样做。我已经测试过这个。

创建数据库并启用查询存储。

CREATE DATABASE QueryStoreTest
GO
USE QueryStoreTest;
GO
ALTER DATABASE QueryStoreTest
SET QUERY_STORE = ON
    (
      OPERATION_MODE = READ_WRITE,
      CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 1 ),
      DATA_FLUSH_INTERVAL_SECONDS = 900,
      MAX_STORAGE_SIZE_MB = 50,
      INTERVAL_LENGTH_MINUTES = 60,
      SIZE_BASED_CLEANUP_MODE = AUTO,
      MAX_PLANS_PER_QUERY = 10,
      WAIT_STATS_CAPTURE_MODE = ON,
      QUERY_CAPTURE_MODE = ALL /* this is required for the testing */
    );
GO
Run Code Online (Sandbox Code Playgroud)

创建并运行耗时的查询。我用过这个:

SELECT 
    *
FROM sys.all_columns AS ac
CROSS JOIN sys.all_parameters AS ap
CROSS JOIN sys.all_objects AS ao
Run Code Online (Sandbox Code Playgroud)

在SSMS中运行查询完成或停止执行,并且可以在查询存储中找到该查询。

SELECT 
    qsq.query_id
    , qsq.query_hash
    , qsp.plan_id
    , qsqt.query_sql_text
    , qsrs.count_executions
    , qsrs.execution_type_desc
FROM sys.query_store_query AS qsq
LEFT JOIN sys.query_store_plan AS qsp
    ON qsp.query_id = qsq.query_id
LEFT JOIN sys.query_store_query_text AS qsqt
    ON qsqt.query_text_id = qsq.query_text_id
JOIN sys.query_store_runtime_stats AS qsrs
    ON qsrs.plan_id = qsp.plan_id
WHERE qsqt.query_sql_text LIKE '%cross join%'
AND qsqt.query_sql_text NOT LIKE '%query_store%'
Run Code Online (Sandbox Code Playgroud)

执行类型是RegularAborted。但是,如果您从另一个窗口终止会话,则 count_executions 既不会增加也不会产生新记录。


Joh*_* N. 5

您可能需要考虑使用较新版本的 SQL Server 提供的扩展事件(快速启动扩展事件)功能来跟踪花费超过一定时间的查询。

\n

让我们为您创建一个扩展事件,捕获运行时间超过 60 秒的语句(仅作为示例)。

\n

导航到 SSMS 中的扩展事件

\n

SQL Server 实例 |  管理|  延伸活动 |  会议

\n

在这里,您可以右键单击“会话”分支以打开上下文菜单。

\n

新会话...

\n

新会话...上下文菜单项

\n

与标记的会话相反,我们将使用空的“新会话...”选项。

\n

新建会话向导简介

\n

新建会话向导介绍对话框

\n

单击“下一步”>

\n

新建会话向导设置会话属性

\n

新建会话向导设置会话属性对话框

\n

我们将为会话命名:Statement Duration > 1 Minute ,然后单击“在服务器启动时启动事件会话”选项,然后单击“下一步”> ..

\n

新建会话向导选择模板

\n

新建会话向导选择模板对话框

\n

我们不会使用默认模板。下一页>

\n

新建会话向导选择要捕获的事件

\n

新建会话向导选择要捕获的事件对话框

\n

我们将仅使用sql_transaction事件,并使用相应的>箭头将其移至右侧。下一页 > .

\n

新会话向导捕获全局字段

\n

新会话向导捕获全局字段对话框

\n

我们至少选择sql_text字段,但我添加了更多类似的内容:

\n
    \n
  • 客户端应用程序名称
  • \n
  • 客户端主机名
  • \n
  • 数据库名称
  • \n
  • nt_用户名
  • \n
  • 计划句柄
  • \n
  • 查询哈希值
  • \n
  • 查询计划哈希
  • \n
  • sql_文本
  • \n
  • 用户名
  • \n
\n

...然后点击“下一步”>

\n

新建会话向导设置会话事件过滤器

\n

新建会话向导“设置会话事件过滤器”对话框

\n

我们暂时过滤sqlos.task_execution_time并将值设置为6000。我们将返回此设置,将其更改为持续时间。点击下一步 >

\n

新建会话向导指定会话数据存储

\n

新建会话向导“指定会话数据存储”对话框

\n

您可以在此处指定要将数据存储在文件或ring_bugger 目标中的位置。我们暂时使用一个文件。配置适合您的服务器的值,然后单击“下一步”>

\n

新建会话向导摘要

\n

新建会话向导摘要对话框

\n

验证您的配置并单击“下一步”>

\n

新建会话向导创建事件会话

\n

新建会话向导创建事件会话对话框

\n

选择两个选项以运行某些内容,然后单击“下一步”>

\n

延伸活动 | 会议 | 声明持续时间 > 1 分钟

\n

延伸活动 |  会议 |  陈述时长 > 1 分钟图片

\n

您现在将拥有一个新的扩展事件和一个显示该扩展事件当前输出的窗口。

\n

更改配置

\n

右键单击该会话并将其停止。再次右键单击并进入属性:

\n

会话属性

\n

选择sql_transaction,然后单击“配置”> ...

\n

会话属性配置过滤器

\n

...切换到“过滤器”选项卡并删除当前过滤器。添加一个新过滤器,其值持续时间大于60000000)。

\n

单击“确定” ,然后在“扩展事件”中再次开始会话。您可能必须选择“观看实时数据”才能打开当前窗口。

\n

扩展事件会话的上下文菜单

\n

有趣的部分

\n

现在您有了一个扩展事件会话,它将跟踪耗时超过 60 秒的语句。在该服务器上运行如下语句:

\n
BEGIN TRAN\n    UPDATE DemoDB.dbo.Tweets SET TweetText = \'something else\' WHERE TweetID = 2;\n    WAITFOR DELAY \'00:02\';\nCOMMIT TRAN;\n
Run Code Online (Sandbox Code Playgroud)\n

一分钟后,您应该会在观看实时数据中看到一个事件弹出。它可能看起来像这样:

\n

捕获实时会话数据

\n

您可以阅读该语句,并且使用plan_handle您甚至可以去查询sys.dm_exec_text_query_plan以查看执行计划:

\n
SELECT \nCAST(query_plan AS XML) \nFROM sys.dm_exec_text_query_plan(0x06000100C0187C0A601FD200D902000001000000000000000000000000000000000000000000000000000000,0,-1)\n
Run Code Online (Sandbox Code Playgroud)\n

这表明:

\n

查询结果集

\n

单击 XML 链接并查看\xc3\xa0:

\n

图形化执行计划

\n

然后可以使用此(在我的示例中)执行计划来查看事情是否运行正常,或者您是否可以从附加索引或查询调整中受益。

\n

回答你的问题

\n
\n

是否有任何选项可以在查询存储中查看已终止的会话?

\n
\n

如果该语句之前已运行过,但时间不超过超时时间,则可能会在查询存储中找到这些查询。

\n

如果语句因某些内容发生变化而终止,那么也许是这样。这取决于超时的原因。

\n

按照我的解决方案中的说明创建扩展事件,而不是将其设置为 30 分钟,而是将超时设置为 29 分 59 秒,或者使用过滤器值1799000000微秒的过滤值。

\n

您现在应该能够在实时数据或创建的文件中跟踪长时间运行的事务。

\n