不要在 Query Store Clean 上 RESEED 表

use*_*433 0 sql-server t-sql truncate query-store

我们正在使用查询存储。现在我们通过每晚清理查询存储解决了一个问题。当您清理查询存储时,查询存储表正在被RESEED编辑 :-(

您知道如何在不RESEED使用表的情况下清理查询存储吗?

Jos*_*ell 11

假设您正在使用该命令ALTER DATABASE [YourDatabaseName] SET QUERY_STORE CLEAR来“清理查询存储”,我决定查看该命令执行时在幕后运行的查询。

为此,我使用 SSMS 附带的“查询详细信息跟踪”XE 模板设置了一个基本的扩展事件会话。这捕获了几个应该涵盖系统上运行的大多数查询的事件:

  • 错误报告
  • 模块结束
  • rpc_已完成
  • sp_statement_completed
  • sql_batch_已完成
  • sql_statement_completed

默认情况下,它排除在系统数据库 ( database_id > 4)上下文中运行的查询,这对于此测试来说很好,因为查询存储位于启用它的用户数据库中。

启动该 XE 会话后,我运行了该ALTER DATABASE...SET QUERY_STORE CLEAR命令,该会话获取了以下查询:

TRUNCATE table sys.plan_persist_runtime_stats;
TRUNCATE table sys.plan_persist_runtime_stats_interval;
TRUNCATE table sys.plan_persist_plan;
TRUNCATE table sys.plan_persist_query;
TRUNCATE table sys.plan_persist_query_text;
Run Code Online (Sandbox Code Playgroud)

在“CLEAR”运行此附加语句之后添加可选的“ALL”参数:

TRUNCATE table sys.plan_persist_context_settings;
Run Code Online (Sandbox Code Playgroud)

您可能会注意到这些是查询存储目录视图的基表。

TRUNCATE TABLE 重置身份值:

如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果未定义种子,则使用默认值 1。要保留身份计数器,请改用 DELETE。

因此,此行为是“设计使然” - 您不能跨“查询存储清除”操作依赖查询存储表中的标识值。

您通过清除查询存储解决了什么问题?如果您在新问题中提供该上下文,也许我们可以建议不同的选项。

在不截断表的情况下删除某些查询的一些潜在选项可以在这里找到:

查询存储的最佳实践 - 在查询存储中保留最相关的数据

  • 配置基于时间的策略以激活自动清理
  • 激活基于大小的清理策略
  • 将查询捕获模式配置为自动

前两个选项会导致 Query Store 中的行根据它们的年龄和/或查询的开销由 id 删除。

第二个选项首先限制添加到查询存储的数据量。