Оптимизатор MS SQL Server выбирает план выполнения запроса по стоимостной модели, входом которой служат оценки числа строк промежуточных результатов. Ошибки этих оценок на порядки встречаются регулярно и являются главной причиной выбора неэффективных планов [1]. Кроме того, производительность снижают отсутствующие индексы, несаргабельные предикаты (функция или неявное преобразование типа над столбцом) и parameter sniffing — повторное использование плана, построенного под нетипичное значение параметра.
SQL Server предоставляет данные для диагностики — фактический план в формате SHOWPLAN_XML и хранилище запросов Query Store, — но не их интерпретацию; встроенные предложения недостающих индексов не проверяются выполнением и не формируются для тривиальных планов [2]. Методы машинного обучения для оптимизации запросов, как правило, требуют замены модулей ядра СУБД [3, 4], что невозможно для коммерческой платформы. Цель работы — построить классификатор, который по плану выполнения запуска запроса определяет тип проблемы, используя только штатные средства SQL Server.
Рассматриваются пять классов: NORMAL (нормальное выполнение), MISSING_INDEX (нет индекса), NON_SARGABLE (несаргабельный предикат), CARD_ERROR (ошибка оценки кардинальности при табличных и локальных переменных) и PARAM_SNIFFING. Каждому классу соответствует штатное исправление: создание индекса, переписывание предиката, подсказка OPTION(RECOMPILE), подсказка Query Store. Внешние признаки классов пересекаются: сканирование крупной таблицы возникает и без индекса, и при несаргабельном предикате, а предложение индекса в плане не гарантирует выигрыша от его создания.
Экспертная разметка по виду плана воспроизводит те же эвристики, которые модель должна превзойти. Поэтому предлагается разметка по фактическому эффекту исправления : для запуска выполняется исправление предполагаемого класса, запрос повторяется с теми же параметрами, и метка класса присваивается, если
|
|
(1) |
где
Каждый запуск описывается 62 признаками четырёх групп: 40 признаков оценочного плана (стоимость, число операторов по типам, оценочная селективность сканирования, предложения индексов, предупреждения о неявном преобразовании), 15 признаков фактического плана (q-ошибки оценки числа строк [5], отношение прочитанных строк к возвращённым, сбросы в tempdb, расхождение значений параметров при компиляции и выполнении), 3 признака истории запроса из Query Store и 4 признака — решения эвристических правил. Последние реализуют гибридную схему : модель получает решение правил как признак и исправляет его там, где правила ошибаются. Сравнивались логистическая регрессия, дерево решений, случайный лес [6] и градиентный бустинг из библиотеки scikit-learn [7]. Качество оценивалось перекрёстной проверкой с исключением шаблона запроса (Leave-One-Group-Out, LOGO): модель проверяется на запросах, которых не было в обучении.
Эксперимент проведён на демонстрационной базе данных интернет-магазина объёмом 8,1 млн строк с неравномерными распределениями данных и уровнем совместимости 140 на SQL Server 2022. Рабочая нагрузка из 36 шаблонов запросов выполнена в две фазы по 816 запусков — до и после исправлений. По критерию (1) проблемными признаны 419 запусков из 1632. Показательно, что из 100 запусков с заведомо ошибочной оценкой кардинальности проблемными оказались только 59: формальный признак в плане не тождествен проблеме производительности. Результаты приведены в таблице 1.
Таблица 1
Качество классификации (macro-F1)
|
Модель |
Новые шаблоны (LOGO) |
Случайная 5-кратная проверка |
|
Эвристические правила |
0,569 |
— |
|
Дерево решений |
0,453 |
0,897 |
|
Градиентный бустинг |
0,531 |
0,982 |
|
Случайный лес |
0,567 |
0,977 |
|
Логистическая регрессия |
0,690 |
0,949 |
|
Логистическая регрессия (гибрид) |
0,697 |
0,945 |
Лучший результат на новых шаблонах показала гибридная логистическая регрессия: macro-F1 = 0,70 против 0,57 у правил. Случайная проверка завышает качество до 0,98, поскольку запуски одного шаблона попадают и в обучение, и в проверку; на новых шаблонах ансамбли деревьев запоминают конкретные запросы и уступают линейной модели. Распределение ответов лучшей модели по классам показано на рисунке 1.
Рис. 1. Матрица ошибок гибридной модели при проверке на новых шаблонах
Наибольший выигрыш модель даёт для ошибок кардинальности (F1 = 0,98 против 0,43 у правил): по совокупности признаков она отделяет вредные ошибки оценки от безвредных. Parameter sniffing по единичному плану распознаётся неудовлетворительно (F1 = 0,17) из-за малого числа примеров и сходства неудачного и нормального запусков с одним и тем же планом.
Таким образом, разметка по эффекту исправления и гибридная схема позволяют распознавать проблемы планов выполнения MS SQL Server без вмешательства в ядро СУБД точнее эвристических правил, а оценка качества таких моделей должна выполняться на запросах, не участвовавших в обучении. Перспективным направлением является классификация запросов по агрегатам Query Store, необходимая для распознавания parameter sniffing.
Литература:
- How good are query optimizers, really? / V. Leis, A. Gubichev, A. Mirchev [et al.] // Proceedings of the VLDB Endowment. — 2015. — Vol. 9, № 3. — P. 204–215. — DOI 10.14778/2850583.2850594.
- Настройка некластеризованных индексов с помощью предложений об отсутствующих индексах // Microsoft Learn: [сайт]. — Redmond: Microsoft, 2025. — URL: https://learn.microsoft.com/ru-ru/sql/relational-databases/indexes/tune-nonclustered-missing-index-suggestions (дата обращения: 19.10.2026).
- Database meets artificial intelligence: a survey / X. Zhou, C. Chai, G. Li, J. Sun // IEEE Transactions on Knowledge and Data Engineering. — 2022. — Vol. 34, № 3. — P. 1096–1116. — DOI 10.1109/TKDE.2020.2994641.
- Bao: making learned query optimization practical / R. Marcus, P. Negi, H. Mao [et al.] // Proceedings of the 2021 International Conference on Management of Data. — New York: ACM, 2021. — P. 1275–1288. — DOI 10.1145/3448016.3452838.
- Moerkotte, G. Preventing bad plans by bounding the impact of cardinality estimation errors / G. Moerkotte, T. Neumann, G. Steidl // Proceedings of the VLDB Endowment. — 2009. — Vol. 2, № 1. — P. 982–993. — DOI 10.14778/1687627.1687738.
- Breiman, L. Random forests / L. Breiman // Machine Learning. — 2001. — Vol. 45, № 1. — P. 5–32. — DOI 10.1023/A:1010933404324.
- Scikit-learn: machine learning in Python / F. Pedregosa, G. Varoquaux, A. Gramfort [et al.] // Journal of Machine Learning Research. — 2011. — Vol. 12. — P. 2825–2830.

