Ответ
План выполнения запроса (Query Execution Plan) — это последовательность шагов (операций), которую СУБД (например, SQL Server, PostgreSQL, MySQL) выбирает для извлечения или изменения данных, соответствующих SQL-запросу. Это «дорожная карта», показывающая, как движок базы данных будет выполнять ваш запрос.
Что показывает план?
- Порядок доступа к таблицам: Какие таблицы читаются и в каком порядке (JOIN).
- Методы доступа: Используется ли сканирование таблицы (Table Scan) или поиск по индексу (Index Seek/Scan).
- Операции: Фильтрация (Filter), сортировка (Sort), агрегация (Hash Match), объединение (Nested Loops, Merge Join, Hash Join).
- Оценочная стоимость: Относительная «стоимость» каждой операции в процентах, что помогает найти узкие места.
- Оценочное число строк: Сколько строк ожидает оптимизатор на каждом шаге.
Зачем это нужно разработчику? Анализ плана выполнения — ключевой навык для оптимизации медленных запросов. Он позволяет:
- Найти «узкие места»: Операции с высокой стоимостью (например, Table Scan на большой таблице).
- Проверить использование индексов: Убедиться, что запрос использует индексы эффективно (Index Seek лучше, чем Index Scan или Table Scan).
- Обнаружить недостающие индексы: СУБД часто предлагает потенциально отсутствующие индексы в плане.
- Понять, почему запрос медленный: Из-за сложных JOIN, временных таблиц, неверных оценок кардинальности.
Как получить план запроса?
- В SQL Server Management Studio (SSMS): Включить
SET SHOWPLAN_TEXT ON;(текстовый план) илиSET SHOWPLAN_XML ON;(графический план), либо нажатьCtrl + M(включить отображение плана) и выполнить запрос. - В коде C# / Entity Framework Core: Получить сгенерированный SQL и проанализировать его отдельно.
using (var context = new MyDbContext()) { var query = context.Orders.Where(o => o.Total > 1000); // Получаем SQL (EF Core 5.0+) var sql = query.ToQueryString(); Console.WriteLine(sql); // Этот SQL можно выполнить в SSMS или другом клиенте для анализа плана }Ключевые термины для анализа:
- Table Scan / Index Scan: Полное чтение таблицы или индекса. Может быть дорогим для больших таблиц.
- Index Seek: Эффективный поиск по индексу с использованием предиката.
- Key Lookup (Bookmark Lookup): Дополнительная операция для получения столбцов, не входящих в некластеризованный индекс. Часто указывает на необходимость покрывающего индекса (INCLUDE).
- Sort: Операция сортировки в памяти или на диске (TempDB). Требует ресурсов.
- Spill to TempDB: Когда операция (например, Hash Join) не помещается в оперативной памяти. Серьёзная проблема производительности.
Практический совет: Всегда смотрите на фактический план выполнения (после выполнения запроса), а не только на расчётный, так как он содержит реальную статистику по обработанным строкам и времени.