在 msdb 上启用查询存储有什么好处?

Jam*_*ins 9 sql-server msdb sql-server-2016 query-store

对 SQL 系统数据库(master、model、msdb、tempdb)的查询存储只能在 msdb 上使用。我查看并没有在 msdb 上找到任何有关查询存储的文档。

虽然您无法在 GUI 中看到它,但可以在您的 SQL 2016 实例上对其进行验证

验证查询存储已关闭

USE msdb
SELECT * FROM sys.database_query_store_options; 
Run Code Online (Sandbox Code Playgroud)

打开查询存储

USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = ON
GO
ALTER DATABASE msdb SET QUERY_STORE (OPERATION_MODE = READ_WRITE
, INTERVAL_LENGTH_MINUTES = 30
, MAX_STORAGE_SIZE_MB = 1000
, QUERY_CAPTURE_MODE = AUTO)
GO
Run Code Online (Sandbox Code Playgroud)

验证查询存储已开启

USE msdb
SELECT * FROM sys.database_query_store_options; 
Run Code Online (Sandbox Code Playgroud)

在所有系统数据库中,为什么 msdb 是唯一一个可以选择使用查询存储的数据库,它增加了什么价值?

-- Stop Query Store
USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = OFF
GO
Run Code Online (Sandbox Code Playgroud)

Sql*_*ide 7

Microsoft 启用一项功能并不意味着它对每个人都有用。对于使用某些功能的系统,可能意味着依赖存储在 MSDB 中的信息。在这些情况下,查询存储会很有用。

这里有几篇关于MSDB数据库对象的使用和调优的文章。

来自在线书籍的msdb 数据库

Geoff N. Hiten 的MSDB 性能调优

Tim Radney在 MSDB 上维护的重要性,他提到了以下内容:

优化 msdb 中的索引与您的用户数据库一样重要。很多时候我发现客户在优化用户数据库而不是系统数据库。由于 msdb 数据库被 SQL Server 代理、日志传送、服务代理、SSIS、备份和还原以及其他进程大量使用,因此索引可能会变得高度碎片化。确保您的索引优化作业还包括您的系统数据库,或至少 msdb。我已经看到索引优化从 msdb 中高度碎片化的索引中释放了几 GB 的空间。

我可以看到查询存储如何帮助优化您的索引策略并优化查询/聚合/清除存储在 MSDB 中的一些信息。


Sol*_*zky 5

@SqlWorldWide 回答了问题的“为什么[msdb]”部分,所以我不会在这里重复。但要回答“为什么不[master][model][tempdb]”问题的一部分:

  • [tempdb]是临时存储,就其本质而言,似乎永远不会从自动优化或提供历史分析的能力中受益。如果查询存储跟踪存储过程的执行统计信息,那么当存储过程存在于其他地方时,这将无济于事。虽然可以创建临时存储过程,但本地临时存储过程可能不会从中受益,因为它们的名称包含一个唯一的哈希代码,用于在多个会话中分隔相似的名称。虽然全局临时 Stored Procs 跨会话具有一致的名称,但鉴于临时性质,无法假设跨会话(假设不是同时)具有相同名称的全局临时 Stored Procs 甚至具有相同的代码,因此不能有有意义的/相关统计。

  • [model]是用于创建新数据库的模板(包括[tempdb],每次 SQL Server 实例启动/重新启动时都会重新创建)。查询不会从这里执行。但是,我认为允许在此处启用查询存储以便在创建新数据库时默认情况下启用它可能是有意义的。但是,然而不过,这将意味着查询储存在将被启用[tempdb],而仅仅是愚蠢的(见正上方点)。

    更新:
    哇,耐莉!我只是重新阅读了导致这个问题最初问题,并注意到了一些奇怪的事情:只有[master]and 的错误消息[tempdb];没有报告错误[model]。OP 在复制到问题中时可能只是简单地忽略了该错误消息,因此我在 SQL Server 2016 SP1-CU7-GDR (13.0.4466.4) 上运行了以下命令以亲自查看:

    ALTER DATABASE [model] SET QUERY_STORE = ON; -- completes successfully!
    
    -- Restart instance to force recreation of [tempdb];
    
    CREATE DATABASE [IsQueryStoreEnabledByDefault];
    
    SELECT * FROM sys.databases WHERE [is_query_store_on] = 1;
    
    DROP DATABASE [IsQueryStoreEnabledByDefault];
    
    Run Code Online (Sandbox Code Playgroud)

    结果呢?[model][IsQueryStoreEnabledByDefault]返回,但是[tempdb]不是在结果!因此,附加不过前两个“但是”的情况似乎[model] 可以启用查询储存其中)默认查询存储启用(是的,这是一个字,我甚至查;-)新创建的DB,和b)[tempdb]在服务启动时重新创建 被忽略(因此这不是在 中打开它的后门[tempdb])。  

  • [master]是主系统数据库,您不应在此处运行代码。此外,此处存在且经常使用的存储过程要么不会从优化中受益,要么在调用它们的用户数据库的上下文中执行(即系统存储过程sp_以数据库——不需要完全限定[master]..——并且执行就好像它们实际上存在于每个数据库中一样)并且可能由调用它们的用户数据库中的查询存储管理。