查询存储 - 提高 max_storage_size_mb(查询存储保留,最大大小)会在短时间内起作用,然后又回到 250?

Syl*_*via 3 sql-server query-store

我已经失败了几次了。在 UI 中,我能够成功地将查询存储保留设置中的查询存储大小从 250 mb 增加到 1000 mb。我进行更改,关闭数据库属性窗口,重新打开,看起来更改成功,显示 1000 mb。然后当我再次查看它时(可能是第二天左右),它又恢复到 250 mb。

版本为 Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4。

这里会发生什么?

Eri*_*ing 6

触发器

一种替代方法是创建一个触发器来捕获并记录数据,然后在注意到更改后查看数据。

首先,你需要一张桌子:

CREATE TABLE 
    master.dbo.trigger_log
(
    id int PRIMARY KEY IDENTITY,
    PostTime datetime,
    LoginName sysname,
    CommandText nvarchar(4000)
);
Run Code Online (Sandbox Code Playgroud)

接下来,您需要一个触发器:

CREATE OR ALTER TRIGGER [query_store_shenanigans] 
    ON ALL SERVER
    FOR ALTER_DATABASE
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN
      DECLARE 
          @command nvarchar(4000) = 
              (
                  SELECT 
                      EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(4000)') 
              );

      IF UPPER(@command) LIKE '%SET QUERY_STORE%'
      BEGIN
      
          INSERT 
              master.dbo.trigger_log
          (
              PostTime,
              LoginName,
              CommandText
          )
          SELECT
              PostTime = 
                  x.c.value('(PostTime)[1]', 'datetime'),
              LoginName = 
                  x.c.value('(LoginName)[1]', 'nvarchar(128)'),
              CommandText = 
                  @command
          FROM
          (
              SELECT 
                  event_data = EVENTDATA()
          ) AS e
          CROSS APPLY e.event_data.nodes('/EVENT_INSTANCE') AS x(c);

      END
END;
GO
Run Code Online (Sandbox Code Playgroud)

以及测试日志记录的命令:

ALTER DATABASE StackOverflow 
    SET QUERY_STORE 
    ( 
        WAIT_STATS_CAPTURE_MODE = ON 
    );
Run Code Online (Sandbox Code Playgroud)

查看日志表的查询:

SELECT 
    tl.* 
FROM master.dbo.trigger_log AS tl;
Run Code Online (Sandbox Code Playgroud)

以下是我在运行命令的一些变体后在本地获得的结果:

坚果


Jos*_*ell 5

该设置不应自行更改。

您可以通过设置像这样的扩展事件会话来查看谁或什么正在更改它,以及何时更改它:

CREATE EVENT SESSION [alter_statements] ON SERVER 
ADD EVENT sqlserver.object_altered
(
    ACTION(sqlserver.nt_username,sqlserver.server_principal_name)
    WHERE ([object_name]=N'QDSTest')
)
ADD TARGET package0.event_file (SET filename=N'alter_statements')
WITH (STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION [alter_statements] ON SERVER 
STATE = START;
GO
Run Code Online (Sandbox Code Playgroud)

您需要将“QDSTest”替换为您感兴趣的数据库名称。

有了它,您应该能够找到与发出ALTER TABLE更改查询存储设置的语句的会话相关联的用户名,这有望有助于跟踪更改该设置的人员或内容。

一种可能性是您使用基于模型的方法(如 SQL Server Data Tools dacpac 部署)自动部署到此数据库。如果“模型”以某种方式配置了查询存储,则每个部署都会尝试将设置更改回模型中的设置。


Zik*_*ato 5

我同意 Josh Darnell 的观点,即您应该设置一个扩展活动会议,但我建议举办一个更具体的活动。我最近用它来解决查询存储的问题。

CREATE EVENT SESSION [QueryStoreSettings] ON SERVER 
ADD EVENT qds.query_store_db_settings_changed
(
    ACTION
    (
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_name,
        sqlserver.server_instance_name,
        sqlserver.sql_text,
        sqlserver.username
    )
)
ADD TARGET package0.event_file(SET filename=N'QueryStoreSettings',max_file_size=(5),max_rollover_files=(10))
WITH (STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION [QueryStoreSettings] ON SERVER 
STATE = START;
GO
Run Code Online (Sandbox Code Playgroud)

这是我使用 GUI 进行更改时得到的输出 在此输入图像描述