Открыть сервис

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 — текст запросов.

Наиболее часто используемый сценарий — выявление запросов, чья производительность ухудшилась из-за изменения плана выполнения. Администратор может:

  1. Найти запрос с высокой вариативностью длительности выполнения.
  2. Просмотреть историю планов выполнения для этого запроса.
  3. Сравнить метрики выполнения разных планов.
  4. Принудительно зафиксировать эффективный план (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 порог максимального размера хранилища автоматически регулируется в зависимости от уровня службы.

Источники

  1. Microsoft Docs. «Monitor performance by using the Query Store». SQL Server documentation.
  2. Microsoft Docs. «ALTER DATABASE SET QUERY_STORE (Transact-SQL)».
  3. Microsoft Docs. «Query Store catalog views (Transact-SQL)».
  4. Microsoft Docs. «Automatic tuning in SQL Server».
  5. Microsoft Docs. «Query Store best practices».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →