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。
这里会发生什么?
一种替代方法是创建一个触发器来捕获并记录数据,然后在注意到更改后查看数据。
首先,你需要一张桌子:
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)
以下是我在运行命令的一些变体后在本地获得的结果:
该设置不应自行更改。
您可以通过设置像这样的扩展事件会话来查看谁或什么正在更改它,以及何时更改它:
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 部署)自动部署到此数据库。如果“模型”以某种方式配置了查询存储,则每个部署都会尝试将设置更改回模型中的设置。
我同意 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)
归档时间: |
|
查看次数: |
215 次 |
最近记录: |