Мониторинг пространства, используемого в Query Store
На прошлой неделе я представил сессию в Query Store и, когда говорил о настройках, я упомянул, что пространство для мониторинга, используемое Query Store, чрезвычайно важно, когда вы сначала включаете его для базы данных. Кто-то спросил меня, как я это сделаю, и когда я представил объяснение, я понял, что должен документировать свой метод ... потому что каждый раз даю один и тот же пример, и мне было бы хорошо иметь код.
Для тех из вас, кто не знаком с настройками Query Store, просмотрите мое сообщение, в котором перечислены все, значения по умолчанию и то, что я рекомендовал бы для значений и почему. При обсуждении MAX_STORAGE_SIZE_MB я упоминаю мониторинг через sys.database_query_store_options или Extended Events.
При всей моей любви к расширенным событиям, нет события, которое срабатывает на основе превышения порогового значения. Событие, связанное с размером, является query_store_disk_size_over_limit, и оно срабатывает, когда используемое пространство превышает значение для MAX_STORAGE_SIZE_MB, что слишком поздно. Я хочу принять меры до того, как будет достигнут максимальный размер хранилища.
Поэтому лучшим вариантом, который я нашел, является создание задания агента, которое выполняется на регулярной основе (возможно, каждые четыре или шесть часов изначально), которое проверяет current_storage_size_mb в sys.database_query_store_options и вычисляет пространство, используемое Query Store, в процентах от общего количества выделенных, а затем, если это превышает установленный порог, отправляет электронное письмо. Код, который вы можете поместить в задание агента, приведен ниже.
Внимательно убедитесь, что задание выполняется в контексте пользовательской базы данных с включенным Query Store (поскольку sys.database_query_store_options - это представление базы данных) и настройте порог на значение, которое имеет смысл для вашего MAX_STORAGE_SIZE_MB. По моему опыту, 80% были хорошей отправной точкой, но не стесняйтесь настраивать его по своему усмотрению!
После того, как размер вашего хранилища запросов будет изменен и стабилизирован, я бы оставил все как есть в целях безопасности, чтобы предупредить вас о необходимости изменения (например, кто-то изменит настройку Query Store, которая косвенно влияет на используемое хранилище).
/* Change DBNameHere as appropriate */
USE [DBNameHere]
/* Change Threshold as appropriate */
DECLARE
@Threshold
DECIMAL
(4,2) = 80.00
DECLARE
@CurrentStorage
INT
DECLARE
@MaxStorage
INT
SELECT
@CurrentStorage = current_storage_size_mb, @MaxStorage = max_storage_size_mb
FROM
sys.database_query_store_options
IF (
SELECT
CAST
(
CAST
(current_storage_size_mb
AS
DECIMAL
(21,2))/
CAST
(max_storage_size_mb
AS
DECIMAL
(21,2))*100
AS
DECIMAL
(4,2))
FROM
sys.database_query_store_options) >= @Threshold
BEGIN
DECLARE
@EmailText NVARCHAR(
MAX
) = N
'The Query Store current space used is '
+
CAST
(@CurrentStorage
AS
NVARCHAR(19)) +
'MB
and the max space configured is '
+
CAST
(@MaxStorage
AS
NVARCHAR(19)) +
'MB,
which exceeds the threshold of '
+
CAST
(@Threshold
AS
NVARCHAR(19) )+
'%.
Please allocate more space to Query Store or decrease the amount of data retained (stale_query_threshold_days).'
/* Edit profile_name and recipients as appropriate */
EXEC
msdb.dbo.sp_send_dbmail
@profile_name =
'SQL DBAs'
,
@recipients =
'DBAs@yourcompany.com'
,
@body = @EmailText,
@subject =
'Storage Threshold for Query Store Exceeded'
;
END