← Назад к вопросам

Как будешь смотреть план запросов в MSSQL?

2.0 Middle🔥 181 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как посмотреть план выполнения запросов в Microsoft SQL Server

План выполнения запросов — это ключевой инструмент для анализа производительности SQL-запросов, позволяющий понять, как SQL Server оптимизирует и выполняет запрос. Вот основные способы получения и анализа планов выполнения в MSSQL.

1. Графический план выполнения (SSMS)

Самый простой способ для визуального анализа. В SQL Server Management Studio (SSMS) можно включить отображение плана перед выполнением запроса:

-- Включить графический план в SSMS (Ctrl + M)
SELECT 
    o.OrderID,
    c.CustomerName,
    p.ProductName,
    od.Quantity
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
JOIN OrderDetails od ON o.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
WHERE o.OrderDate >= '2023-01-01';

После выполнения в отдельной вкладке откроется графическое представление плана, где можно наводить курсор на операторы для получения детальной информации (оценки стоимости, количество строк, используемые индексы).

2. Текстовый план (SHOWPLAN_TEXT / SHOWPLAN_ALL)

Более легковесные варианты для консольного анализа:

-- Включить текстовый план
SET SHOWPLAN_TEXT ON;
GO
-- Ваш запрос
SELECT * FROM Employees WHERE DepartmentID = 5;
GO
SET SHOWPLAN_TEXT OFF;

-- Более подробная версия
SET SHOWPLAN_ALL ON;
GO
SELECT * FROM Products WHERE Price > 100;
GO
SET SHOWPLAN_ALL OFF;

3. XML-план выполнения (SHOWPLAN_XML)

Наиболее полный формат, содержащий максимум информации для анализа:

-- Получить план в XML формате
SET SHOWPLAN_XML ON;
GO
SELECT e.Name, d.DepartmentName 
FROM Employees e 
JOIN Departments d ON e.DepartmentID = d.DepartmentID;
GO
SET SHOWPLAN_XML OFF;

-- Альтернативный способ для конкретного запроса
SELECT * FROM sys.dm_exec_query_plan([plan_handle]);

4. Фактический план выполнения

Показывает реальный план после выполнения запроса (включает фактические метрики):

-- Включить фактический план в SSMS (Ctrl + M)
-- или использовать SET STATISTICS XML ON
SET STATISTICS XML ON;
SELECT * FROM Sales WHERE Year = 2023 ORDER BY Amount DESC;
SET STATISTICS XML OFF;

5. Динамические административные представления (DMV)

Для анализа планов уже выполненных запросов, находящихся в кэше:

-- Найти запросы с высокими затратами ресурсов
SELECT 
    qs.execution_count,
    qs.total_worker_time/qs.execution_count as avg_cpu_time,
    qs.total_elapsed_time/qs.execution_count as avg_duration,
    qt.text,
    qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qt.text LIKE '%Ваш_запрос%'
ORDER BY qs.total_worker_time DESC;

Ключевые метрики для анализа в плане выполнения

При анализе плана обратите внимание на следующие критические показатели:

  • Стоимость оператора (Relative Cost) — процент от общей стоимости запроса
  • Оценка количества строк vs Фактическое количество строк — расхождения указывают на проблемы со статистикой
  • Типы операций:
    • Table Scan / Clustered Index Scan — полное сканирование (часто неэффективно)
    • Index Seek — выборочный доступ по индексу (обычно оптимально)
    • Key Lookup / RID Lookup — обращения к основной таблице (может требовать покрывающего индекса)
    • Hash Match / Merge Join / Nested Loops — алгоритмы соединения таблиц
    • Sort — операции сортировки (ресурсоемкие)

Пример анализа проблемного плана

-- Проблемный запрос с отсутствующим индексом
SET SHOWPLAN_XML ON;
GO
-- Запрос выполняет сканирование вместо поиска
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE LastName = 'Smith' AND DepartmentID = 3;
GO
SET SHOWPLAN_XML OFF;

В этом случае план может показать Clustered Index Scan вместо Index Seek. Решением будет создание индекса:

CREATE INDEX IX_Employees_LastName_DepartmentID 
ON Employees(LastName, DepartmentID)
INCLUDE (FirstName, Salary);

Практические рекомендации

  1. Всегда смотрите фактический план для продакшен-анализа, так как он содержит реальные метрики выполнения
  2. Обращайте внимание на предупреждения (желтые значки в графическом плане) — они указывают на потенциальные проблемы
  3. Анализируйте наиболее дорогие операции — обычно 80% проблем сосредоточены в 20% самых затратных операторов
  4. Сравнивайте планы до и после оптимизации для оценки эффективности изменений
  5. Используйте Database Engine Tuning Advisor для получения рекомендаций по индексам

Полезные команды для дополнительной диагностики

-- Включить детальную статистику ввода-вывода и времени
SET STATISTICS IO ON;
SET STATISTICS TIME ON;

-- Очистить кэш планов (только для тестовых сред!)
DBCC FREEPROCCACHE;

-- Очистить кэш данных (осторожно!)
CHECKPOINT;
DBCC DROPCLEANBUFFERS;

Умение читать и анализировать планы выполнения — важнейший навык для разработчика C# Backend, работающего с MSSQL, так как позволяет выявлять и устранять узкие места производительности на уровне базы данных, что часто дает на порядок больше эффекта, чем оптимизация кода приложения.

Как будешь смотреть план запросов в MSSQL? | PrepBro