Мониторинг пространства, используемого в Query Store

Tags: 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
Эрин Стеллато

No Comments

Add a Comment