Мониторинг пространства, используемого в 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.00DECLARE @CurrentStorage INTDECLARE @MaxStorage INTSELECT @CurrentStorage = current_storage_size_mb, @MaxStorage = max_storage_size_mbFROM sys.database_query_store_optionsIF (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) >= @ThresholdBEGIN 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