Что такое планы выполнения SQL и как они могут мне помочь? - PullRequest
8 голосов
/ 29 января 2010

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

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

Ответы [ 7 ]

4 голосов
/ 29 января 2010

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

SQL запрос, подобный следующему:

SELECT  *
FROM    mytable1
JOIN    mytable2
ON      …
GROUP BY
        …
ORDER BY
        …

, описывает , что должно быть сделано, но не , как это должно быть сделано.

План выполнения показывает как : какие индексы используются, какие методы объединения выбираются (вложенные циклы или хеш-соединение или объединение слиянием), как группируются результаты (с помощью сортировки или хэширования), как они заказаны и т. д.

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

Классическим примером были бы такие запросы:

SELECT  (
        SELECT  COUNT(*)
        FROM    mytable mi
        WHERE   mi.id <= mo.id
        )
FROM    mytable mo
ORDER BY 
        id

и

SELECT  RANK() OVER (ORDER BY id)
FROM    mytable

, которые делают то же самое и теоретически должны выполняться с использованием тех же алгоритмов.

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

Он будет делать то, что ему велено: подсчитывать строки снова и снова.

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

Возможно, вы захотите прочитать эту статью в моем блоге:

2 голосов
/ 29 января 2010

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

1 голос
/ 29 января 2010

Вот отличный ресурс, который поможет вам понять их http://downloads.red -gate.com / электронные книги / HighPerformanceSQL_ebook.zip

Это от компании red-gate, которая делает отличные инструменты для SQL-сервера, она бесплатна и стоит того, чтобы ее скачать и прочитать.

1 голос
/ 29 января 2010
  1. План выполнения показывает, как именно SQL Server обрабатывает запрос
  2. он создается как часть процесса оптимизации запросов, который выполняет SQL Server. Это не то, что вы создаете напрямую.
  3. он покажет, какие индексы он решил использовать лучше всего, и в основном это план того, как SQL-сервер обрабатывает запрос
  4. Оптимизатор запросов примет запрос, проанализирует его и, возможно, предложит несколько различных планов выполнения. Это процесс оптимизации, основанный на затратах, и он выберет тот, который он считает лучшим.
  5. после того, как план выполнения был сгенерирован, он попадет в кэш плана, чтобы последующие вызовы для того же запроса снова могли использовать тот же план, чтобы избавить от необходимости переделывать работу для создания плана.
  6. планы выполнения автоматически удаляются из кэша в зависимости от их значения (планы с низким значением удаляются раньше, чем планы с высоким значением, чтобы обеспечить максимальный прирост производительности)
  7. планы выполнения помогают определить проблемы с производительностью, например, при отсутствии индексов
1 голос
/ 29 января 2010

Чтобы облегчить эту задачу, достаточно просто использовать «Ctrl L» (Query | Показать примерный план выполнения) для некоторых ваших запросов в SQL Management Studio.

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

Запросить планы в крошечной скорлупе :
По сути, план запроса показывает, как SQL Server намеревается использовать его при решении запроса.
Вариантов действительно много, даже с простыми запросами.
Например, при работе с JOIN необходимо решить, следует ли циклически проходить по [отфильтрованным] строкам «таблицы A» и искать строки в «таблице B», или вместо этого сначала просматривать цикл по «таблице B» (это упрощенный пример, так как есть много других приемов, которые можно использовать при работе с JOIN). Как правило, SQL оценивает количество [отфильтрованных] строк, которые будут созданы любой из таблиц, и выбирает ту, которая меньше всего рассчитывает для внешнего цикла (поскольку это уменьшит количество поисков в другой таблице)
Другой пример - решить, какие индексы использовать (или не использовать).

Существует множество онлайн-ресурсов, а также книг, в которых более подробно описываются планы запросов, трудность заключается в том, что оптимизация производительности SQL является очень широкой и сложной проблемой, и многие такие ресурсы, как правило, слишком детализированы для начинающего ; Сначала нужно понять фундаментальные принципы и структуры, лежащие в основе SQL Server (способ работы индексов, способ хранения данных, разница между кластерными индексами и кучами ...), прежде чем углубляться во многие из [важные] детали оптимизации запросов. Это немного похоже на бейсбол: сначала вы должны знать правила, прежде чем понимать все тонкие [и важные] концепции, связанные со стратегией игры.

См. Этот связанный SO Вопрос для дополнительных указателей.

0 голосов
/ 29 января 2010

План выполнения показывает, как база данных извлекает, сортирует и фильтрует данные, необходимые для вашего запроса.

Например:

SELECT
    *
FROM
    TableA
INNER JOIN
    TableB
ON
    TableA.Id = TableB.TableAId
WHERE
    TableB.TypeId = 2
ORDER BY
    TableB.Date ASC

Результатом будет план выполнения, показывающий, что база данных получает записи из таблиц A и TableB, сопоставляя их для соответствия JOIN, фильтруя для удовлетворения WHERE и сортируя для удовлетворения ORDER BY.

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

0 голосов
/ 29 января 2010

это очень серьезная часть знаний. И я настоятельно рекомендую специальные учебные курсы по этому вопросу. Что касается меня, проведя неделю на курсах, я увеличил производительность запросов примерно в 1000 раз ( ностальгия )

...