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

Ответ

В SQL Server Management Studio (SSMS) есть несколько основных способов:

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

  • Предполагаемый план (Estimated): Нажимаю Ctrl+L или кнопку "Display Estimated Execution Plan". Запрос не выполняется, план строится на основе статистики.
  • Фактический план (Actual): Включаю кнопку "Include Actual Execution Plan" (Ctrl+M), затем выполняю запрос. Во вкладке Execution plan отобразится реальный план с метриками времени и количества строк.

2. Текстовый/XML план:

  • Можно получить план в формате XML для детального анализа или сравнения.
    SET STATISTICS XML ON;
    GO
    SELECT * FROM Sales.Orders WHERE OrderDate > '2023-01-01';
    GO
    SET STATISTICS XML OFF;

На что смотрю в плане (сверху вниз, справа налево):

  • Стоимость операций (Relative Cost %): Выявляю наиболее дорогие узлы (жирные стрелки).
  • Тип доступа к данным: Index Seek (хорошо) vs Index/Table Scan (плохо, если таблица большая).
  • Key Lookup (RID Lookup): Указывает на недостающий покрывающий индекс.
  • Предупреждения: Жёлтые значки — например, "Missing Index", "Implicit Conversion".
  • Фактические vs Оцененные числа строк: Большое расхождение говорит о устаревшей статистике.
  • Дорогие операции: Sort, Hash Match (Join/Aggregate), Spool.

Для анализа исторических проблем использую системные представления: sys.dm_exec_query_stats и sys.dm_exec_query_plan.

Ответ 18+ 🔞

А, ну это же классика, блядь! Смотри, в SSMS есть несколько способов посмотреть, как твой запрос собирается на коленке собирать. Главное — не упасть в обморок, когда увидишь, что он там вытворяет.

1. Графический план (самое наглядное говно):

  • План понарошку (Estimated): Жмёшь Ctrl+L. Запрос не запускается, а тебе показывают фантазии оптимизатора на основе статистики, которая могла помереть три года назад. Как смотреть гороскоп — веришь, но не до конца.
  • Настоящий, в говне и крови план (Actual): Включаешь кнопку "Include Actual Execution Plan" (Ctrl+M), а потом уже запускаешь запрос. Вот тут-то и начинается цирк. Во вкладке Execution plan покажут, что было на самом деле: сколько времени ебалась каждая операция и сколько строк по факту прошло.

2. План в виде текста или XML (для мазохистов и автоматизации):

  • Если хочешь поковыряться в кишках или сравнить два плана, можно вытащить его как XML.
    SET STATISTICS XML ON;
    GO
    SELECT * FROM Sales.Orders WHERE OrderDate > '2023-01-01';
    GO
    SET STATISTICS XML OFF;

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

  • Вес операций (Relative Cost %): Ищешь самые жирные стрелки. Вот этот узел, который 70% всей хуйни съедает — он и есть твой враг.
  • Как лезет в данные: Index Seek — молодец, пошёл по нужному индексу. Index/Table Scan — обосрался, читает всё подряд, как угарелый. Для большой таблицы — это пиздец, а не операция.
  • Key Lookup (он же RID Lookup): Это тебе прямо намёк, что индекс не покрывающий. Сервер находит запись в индексе, а потом идёт по каждой хуйне отдельно в саму таблицу, как дурак. Теряет время, как последний распиздяй.
  • Жёлтые иконки-предупреждения: Внимание, ёпта! Если видишь жёлтый треугольник с восклицательным знаком — это "Missing Index" или "Implicit Conversion". Игнорируешь — сам потом будешь плакать.
  • Цифры "Фактические vs Ожидаемые строки": Если оптимизатор ожидал 10 строк, а по факту их 100 000 — у тебя статистика хуёвая, и он составил план, как слепой котёнок. Расхождение в разы — уже повод волосы на жопе рвать.
  • Дорогие операции-пожиратели: Sort (сортировка), Hash Match (для соединений или агрегации), Spool (временные результаты). Если они появляются на больших данных — готовься к долгой, долгой песне.

А если тебе нужно понять, что там творилось в прошлом, пока ты спал, лезь в системные представления: sys.dm_exec_query_stats и sys.dm_exec_query_plan. Там, бывает, такие планы лежат, что диву даёшься, как система вообще ещё жива.