Изучение планов выполнения

В этой статье излагаются основные вещи, которые нам необходимо знать при изучении планов выполнения.

Вступление

Приходилось ли вам когда-нибудь оптимизировать SQL-запрос, в котором указание на узкое место производительности было нетривиальным делом?

В таких случаях вам пригодится план выполнения, который предоставляет SQL Server, и вам будет лучше правильно его интерпретировать, поскольку он показывает много важной информации о том, как оптимизатор запросов выполняет ваш запрос и т. Д.

В запросе декларативно указывается, какие данные нам нужно получить, но какие шаги будут выполнять обработчик запросов. Итак, план запроса (или также план выполнения) показывает нам, как SQL Server решает получить запрошенные нами данные.

Распространенное заблуждение состоит в том, что SQL Server выбирает лучший план, тогда как на самом деле он выбирает план, который «достаточно хорош», поскольку может быть много возможных последовательностей, и выполнение всех из них может занять слишком много времени.

В этой статье мы рассмотрим основные операторы, которые показаны в плане выполнения, и некоторые моменты, которые следует учитывать при его изучении.

Что такое план выполнения и где его найти?

Планы исполнения бывают двух типов - оценочные и фактические.

Первый генерируется без выполнения запроса T-SQL и поэтому не содержит информации о времени выполнения. Вы можете отобразить его, нажав кнопку Показать предполагаемый план выполнения на панели инструментов для определенного запроса.

Фактические планы выполнения генерируются после выполнения запросов T-SQL и содержат информацию времени выполнения, такую ​​как фактические показатели использования ресурсов и предупреждения времени выполнения (если есть). Вы можете отобразить его, нажав кнопку Включить фактический план выполнения на панели инструментов.

Операторы

Давайте рассмотрим некоторые операторы, которые вы можете увидеть в плане выполнения:

  • Сканирование индекса. Сканирование индекса означает, что SQL Server считывает все строки в таблице, а затем возвращает те, которые удовлетворяют условиям поиска. Это эффективная стратегия, когда таблица мала или большинство строк подходят для предиката.
  • Поиск по индексу - поиск по индексу, с другой стороны, означает, что он затрагивает только те строки, которые содержат эти подходящие строки. Следовательно, это наиболее выгодно в случаях, когда будет возвращен небольшой процент записей.
  • Сортировка - это одна из самых дорогостоящих операций, которую вы можете выполнить, поэтому по возможности ее следует избегать. Индексирование столбца - один из способов уменьшить необходимость использования этого оператора.
  • Хэш-соединение. Хэш-соединение - одна из самых дорогих операций соединения, поскольку для этого требуется хеш-таблица. Это соединение лучше всего подходит для больших несортированных входных данных. Сначала он считывает один из входных данных, хеширует столбец соединения и помещает полученный хэш и значения столбца в хеш-таблицу, созданную в памяти. Затем он считывает все строки во втором входе, хеширует их и проверяет строки в результирующем хеш-ведре на наличие соединяющихся строк.
  • Вложенный цикл - работает, перебирая все строки одного входа и для каждой строки перебирая все строки второго входа в поисках совпадений.
  • Объединение слиянием - работает, просматривая два входа, сравнивая строки и выводя совпадающие строки. Оба входа должны быть отсортированы по столбцам соединения, чтобы это соединение было возможным.

Конечно, этот список далеко не исчерпывающий.

Как мы на самом деле читаем план выполнения?

Мы начинаем интерпретацию плана, глядя на оператора в правом верхнем углу, и идем влево в направлении стрелок.

Стрелки между операторами обозначают поток данных. У них также разная толщина - чем они толще, тем больше строк читается между операторами.

Под каждым из операторов отображается процент затрат этого оператора по сравнению со всеми остальными. Эти относительные затраты иногда могут помочь вам определить узкие места в производительности.

Вы также можете проверить приблизительное количество строк и фактическое количество строк, наведя курсор на любой из значков операторов или любую стрелку.

Еще одна вещь, о которой следует помнить, - это предупреждающие знаки, которые иногда появляются в правом нижнем углу оператора. Они указывают на то, что в этом операторе есть предупреждение. Мы можем узнать об этом больше, наведя курсор мыши на.

Одно из наиболее распространенных предупреждений - когда оператор «передает данные» на tempdb.

Обычно причина кроется в большой разнице между предполагаемым количеством строк и фактическим количеством строк.

Когда оценка слишком мала, оптимизатор запросов выделяет меньше памяти, чем необходимо, и это приводит к записи данных в tempdb, что, очевидно, медленнее.

Заключение

В этой статье мы рассмотрели основы планов выполнения в SQL Server - как их найти, некоторые операторы и как их интерпретировать. Конечно, эта тема намного глубже, чем мы здесь рассмотрели.

Пожалуйста, не стесняйтесь комментировать, если есть неточности или у вас есть вопросы.

Ресурсы

  1. Показать фактический план выполнения
  2. 5 вещей, которые нужно знать при чтении планов выполнения
  3. SQLAuthority