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


9

在SQL系统数据库(主数据库,模型数据库,msdb数据库,tempdb数据库)中,查询存储只能在msdb上使用。我查看了,没有找到有关msdb上查询存储的任何文档。

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

验证查询存储已关闭

USE msdb
SELECT * FROM sys.database_query_store_options; 

开启查询存储

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

验证查询存储已打开

USE msdb
SELECT * FROM sys.database_query_store_options; 

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

-- Stop Query Store
USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = OFF
GO

詹姆斯,请查看我的答案更新[model],该更新与被列入“不允许”列表中有关。
所罗门·鲁兹基

@SolomonRutzky我看到了,非常有趣。我对您的回答有意见,请随时继续扩大您的答案。
James Jenkins

@SolomonRutzky实际上,也许是一个新问题。请参阅创建新数据库时可以自动打开查询存储吗?
詹姆士·詹金斯

Answers:


7

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

以下是有关MSDB数据库对象的用法和调整的几篇文章。

来自在线书籍的msdb数据库

Geoff N. Hiten对MSDB性能进行的调优

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

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

我可以看到查询存储如何帮助您优化索引策略以及最佳地查询/聚集/清除MSDB中存储的某些信息。


1
除了[msdb]引用中使用的功能外,“其他进程”还将包括以下内容:dbmail,中央管理服务器(CMS)服务(最值得注意的是共享的注册服务器列表),我认为在该链接文章的评论中有人提到基于策略的管理(PBM),我认为服务器审计(至少是定义,但我尚未确认)。
所罗门·鲁兹基

5

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

  • [tempdb]是临时存储,从本质上讲,它似乎永远不会从自动优化或提供历史分析的功能中受益。如果查询存储跟踪存储过程的执行状态,那么当存储过程存在于其他位置时,这将无济于事。尽管可以创建临时存储过程,但是本地临时存储过程可能不会从中受益,因为它们的名称包括唯一的哈希码,以在多个会话之间分隔相似的名称。尽管全局临时存储过程在各个会话中具有一致的名称,但鉴于临时性,无法假设跨会话使用相同名称的全局临时存储过程(假定不在同一时间)甚至具有相同的代码,因此不能具有有意义的 /相关统计。

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

    更新:
    哇,内莉!我只是重新阅读了导致这个问题最初问题,并注意到了一些奇怪的现象:[master]和仅有错误消息[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];

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

  • [master]是主系统数据库,因此您不应在此处运行代码。此外,此处存在的且经常使用的存储过程不会从优化中受益,也不会在调用它们的用户数据库的上下文中执行(即,以开头的系统存储过程sp_在所有情况下都“出现”数据库-不需要完全合格[master]..-并像它们实际存在于每个数据库中一样执行),并且很可能受调用它们的用户数据库中的查询存储的约束。


当您运行USE模型时,SELECT * FROM sys.database_query_store_options; 将模型查询存储设置为打开后,它不会显示为打开。但是>正如您说的那样,新数据库已打开,在我的情况下,它使用了当天早些时候对它进行选择时选择的可选更改。因此,如果您要使用模型,则可能需要根据自己的喜好设置所有查询存储选项,以免出现意外情况。
James Jenkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.