Query Store
Query Store — это встроенный компонент системы управления базами данных Microsoft SQL Server (начиная с версии 2016), предназначенный для автоматического сбора, хранения и анализа статистики выполнения запросов, планов выполнения и связанных с ними метрик производительности. Query Store функционирует как «чёрный ящик» для базы данных, позволяя администраторам и разработчикам отслеживать изменения в производительности запросов во времени, выявлять деградацию производительности, вызванную изменением планов выполнения, и принудительно фиксировать эффективные планы.
История
До появления Query Store администраторы SQL Server полагались на ручные методы мониторинга: использование системных представлений (DMV), таких как sys.dm_exec_query_stats и sys.dm_exec_query_plan, а также на сторонние инструменты. Эти данные были эфемерны — они сбрасывались при перезапуске сервера или при очистке кэша планов. Кроме того, отсутствовала возможность хранить историю изменений планов выполнения для конкретного запроса.
Query Store был впервые представлен в SQL Server 2016 (версия 13.0) как функция уровня базы данных. В SQL Server 2017 (14.0) он был расширен поддержкой режима «Read Only» и улучшенной интеграцией с механизмом автоматической настройки (Automatic Tuning). В SQL Server 2019 (15.0) появилась возможность отслеживать запросы, выполняемые в режиме совместимости с более ранними версиями, и улучшена производительность самого хранилища. В SQL Server 2022 (16.0) Query Store был интегрирован с функцией Intelligent Query Processing (IQP) и получил поддержку для Always On Availability Groups.
Архитектура и принцип работы
Query Store состоит из двух основных компонентов: хранилища данных и механизма сбора статистики. Хранилище данных реализовано в виде внутренних таблиц в базе данных, для которой включена функция. Механизм сбора перехватывает события выполнения запросов (компиляция, перекомпиляция, выполнение) и записывает их в хранилище.
Сбор данных
Для каждого запроса Query Store сохраняет:
- Текст запроса (или его хеш).
- План выполнения (в виде XML-представления).
- Статистику выполнения: количество выполнений, среднее время ЦП, среднее время ввода-вывода, средняя длительность, количество строк, количество ожиданий (wait stats).
- Метки времени: время первой и последней компиляции, время последнего выполнения.
- Контекст выполнения: идентификатор сессии, пользователь, база данных.
Данные собираются в два основных хранилища:
- Plan Store — хранит планы выполнения и их версии.
- Runtime Stats Store — хранит агрегированную статистику выполнения по каждому плану.
Режимы работы
Query Store поддерживает три режима работы, задаваемых параметром QUERY_STORE = OFF | READ_ONLY | READ_WRITE:
- OFF — функция отключена, данные не собираются.
- READ_ONLY — данные не собираются, но хранилище доступно для чтения (например, для анализа исторических данных).
- READ_WRITE (по умолчанию) — данные собираются и записываются в хранилище.
Управление и настройка
Query Store настраивается на уровне базы данных с помощью инструкции ALTER DATABASE SET QUERY_STORE. Основные параметры:
- OPERATION_MODE — режим работы (OFF, READ_ONLY, READ_WRITE).
- DATA_FLUSH_INTERVAL_SECONDS — интервал сброса данных из памяти на диск (по умолчанию 900 секунд).
- INTERVAL_LENGTH_MINUTES — интервал агрегации статистики выполнения (по умолчанию 60 минут).
- MAX_STORAGE_SIZE_MB — максимальный размер хранилища (по умолчанию 100 МБ).
- CLEANUP_POLICY — политика очистки устаревших данных (по умолчанию 30 дней).
- MAX_PLANS_PER_QUERY — максимальное количество планов, сохраняемых для одного запроса (по умолчанию 200).
Пример включения Query Store для базы данных AdventureWorks: ``sql ALTER DATABASE AdventureWorks SET QUERY_STORE = ON; ``
Использование
Мониторинг производительности
Query Store предоставляет несколько системных представлений (DMV) для анализа собранных данных:
sys.query_store_query— информация о запросах.sys.query_store_plan— информация о планах выполнения.sys.query_store_runtime_stats— агрегированная статистика выполнения.sys.query_store_wait_stats— статистика ожиданий (доступна с SQL Server 2017).sys.query_store_query_text— текст запросов.
Наиболее часто используемый сценарий — выявление запросов, чья производительность ухудшилась из-за изменения плана выполнения. Администратор может:
- Найти запрос с высокой вариативностью длительности выполнения.
- Просмотреть историю планов выполнения для этого запроса.
- Сравнить метрики выполнения разных планов.
- Принудительно зафиксировать эффективный план (Force Plan).
Принудительная фиксация планов
Если Query Store обнаруживает, что новый план выполнения привёл к деградации производительности, администратор может принудительно зафиксировать предыдущий эффективный план. Это делается с помощью хранимой процедуры sp_query_store_force_plan: ``sql EXEC sp_query_store_force_plan @query_id = 42, @plan_id = 123; ` Отмена принудительной фиксации выполняется процедурой sp_query_store_unforce_plan`.
Автоматическая настройка
Начиная с SQL Server 2017, Query Store интегрирован с функцией Automatic Tuning. В режиме автоматической настройки сервер может самостоятельно выявлять деградацию планов и принудительно фиксировать предыдущие эффективные планы. Для этого необходимо включить параметр AUTOMATIC_TUNING = FORCE_LAST_GOOD_PLAN: ``sql ALTER DATABASE AdventureWorks SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON); ``
Преимущества и ограничения
Преимущества
- Историчность: данные сохраняются даже после перезапуска сервера или очистки кэша планов.
- Простота использования: не требует установки дополнительного программного обеспечения.
- Интеграция с инструментами: Query Store поддерживается в SQL Server Management Studio (SSMS) и Azure Data Studio, где доступны графические отчёты.
- Поддержка в Azure SQL Database: Query Store включён по умолчанию во всех базах данных Azure SQL.
Ограничения
- Накладные расходы: сбор данных увеличивает нагрузку на ЦП и ввод-вывод, особенно при высокой частоте выполнения запросов.
- Ограничение размера: при достижении максимального размера хранилища (
MAX_STORAGE_SIZE_MB) старые данные автоматически удаляются. - Не поддерживается для всех типов запросов: Query Store не отслеживает запросы, выполняемые в системных базах данных (master, tempdb, msdb), а также запросы, использующие динамические представления (DMV) с недетерминированными планами.
- Зависимость от версии: полный функционал доступен только в SQL Server 2016 и новее.
Примеры использования
Выявление запросов с деградацией производительности
``sql SELECT q.query_id, qt.query_sql_text, AVG(rs.avg_duration) AS avg_duration, MIN(rs.avg_duration) AS min_duration, MAX(rs.avg_duration) AS max_duration FROM sys.query_store_query q JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id JOIN sys.query_store_runtime_stats rs ON q.query_id = rs.query_id GROUP BY q.query_id, qt.query_sql_text HAVING MAX(rs.avg_duration) > 2 * MIN(rs.avg_duration) ORDER BY avg_duration DESC; ``
Просмотр истории планов для запроса
``sql SELECT p.plan_id, p.query_plan, rs.avg_duration, rs.count_executions, rs.last_execution_time FROM sys.query_store_plan p JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id WHERE p.query_id = 42 ORDER BY rs.last_execution_time DESC; ``
Query Store в Azure SQL Database
В Azure SQL Database Query Store включён по умолчанию для всех баз данных. Он используется для автоматической настройки производительности, а также для предоставления рекомендаций по индексам и планам выполнения. В Azure порог максимального размера хранилища автоматически регулируется в зависимости от уровня службы.
Источники
- Microsoft Docs. «Monitor performance by using the Query Store». SQL Server documentation.
- Microsoft Docs. «ALTER DATABASE SET QUERY_STORE (Transact-SQL)».
- Microsoft Docs. «Query Store catalog views (Transact-SQL)».
- Microsoft Docs. «Automatic tuning in SQL Server».
- Microsoft Docs. «Query Store best practices».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →