ada*_*m.g 7 sql-server kill query-store
是否有任何选项可以在查询存储中查看已终止的会话?
我这么问是因为我们有一个附加工具,如果会话运行时间超过 30 分钟(KILL
命令),它就会终止会话。
我想检查查询存储中已终止查询的执行计划。我在查询存储中找不到被这个附加应用程序杀死的会话/查询。
他们不这样做。我已经测试过这个。
创建数据库并启用查询存储。
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)
执行类型是Regular或Aborted。但是,如果您从另一个窗口终止会话,则 count_executions 既不会增加,也不会产生新记录。
您可能需要考虑使用较新版本的 SQL Server 提供的扩展事件(快速启动扩展事件)功能来跟踪花费超过一定时间的查询。
\n让我们为您创建一个扩展事件,捕获运行时间超过 60 秒的语句(仅作为示例)。
\n在这里,您可以右键单击“会话”分支以打开上下文菜单。
\n与标记的会话相反,我们将使用空的“新会话...”选项。
\n单击“下一步”>
\n我们将为会话命名:Statement Duration > 1 Minute ,然后单击“在服务器启动时启动事件会话”选项,然后单击“下一步”> ..
\n我们不会使用默认模板。下一页>
\n我们将仅使用sql_transaction事件,并使用相应的>箭头将其移至右侧。下一页 > .
\n我们至少选择sql_text字段,但我添加了更多类似的内容:
\n...然后点击“下一步”>。
\n我们暂时过滤sqlos.task_execution_time并将值设置为6000。我们将返回此设置,将其更改为持续时间。点击下一步 >。
\n您可以在此处指定要将数据存储在文件或ring_bugger 目标中的位置。我们暂时使用一个文件。配置适合您的服务器的值,然后单击“下一步”>。
\n验证您的配置并单击“下一步”>。
\n选择两个选项以运行某些内容,然后单击“下一步”>。
\n您现在将拥有一个新的扩展事件和一个显示该扩展事件当前输出的窗口。
\n右键单击该会话并将其停止。再次右键单击并进入属性:
\n\n选择sql_transaction,然后单击“配置”> ...
\n\n...切换到“过滤器”选项卡并删除当前过滤器。添加一个新过滤器,其值持续时间大于60000000)。
\n单击“确定” ,然后在“扩展事件”中再次开始会话。您可能必须选择“观看实时数据”才能打开当前窗口。
\n\n现在您有了一个扩展事件会话,它将跟踪耗时超过 60 秒的语句。在该服务器上运行如下语句:
\nBEGIN 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
以查看执行计划:
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按照我的解决方案中的说明创建扩展事件,而不是将其设置为 30 分钟,而是将超时设置为 29 分 59 秒,或者使用过滤器值1799000000
微秒的过滤值。
您现在应该能够在实时数据或创建的文件中跟踪长时间运行的事务。
\n 归档时间: |
|
查看次数: |
773 次 |
最近记录: |