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

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

Связанный вопрос:
Какие общие методы могут применяться для оптимизации SQL-запросов?

Ответ 1

  • Посмотрите план выполнения в анализаторе запросов
  • Посмотрите, какой шаг стоит больше всего
  • Оптимизируйте шаг!
  • Вернуться к шагу 1 [спасибо to Vinko]

Ответ 2

В SQL Server вы можете посмотреть план запроса в Query Analyzer или Management Studio. Это скажет вам приблизительный процент времени, затрачиваемого на каждую партию заявлений. Вы захотите найти следующее:

  • Сканирование таблицы; это означает, что вам не хватает индексов
  • Сканирование индексов; ваш запрос может не использовать правильные индексы
  • Толщина стрелок между каждым шагом в запросе указывает, сколько строк производится на этом шаге, очень толстые стрелки означают, что вы обрабатываете много строк и можете указать, что некоторые объединения должны быть оптимизированы.

Некоторые другие общие советы:

  • Большое количество условных операторов, таких как несколько операторов if-else, может заставить SQL Server постоянно перестраивать план запроса. Вы можете проверить это, используя Profiler.
  • Убедитесь, что разные запросы не блокируют друг друга, например, оператор обновления, блокирующий оператор select. Этого можно избежать, указав подсказку (nolock) в операторах выбора SQL Server.
  • Как уже упоминалось, попробуйте мастер настройки производительности в Studio Management Studio.

Наконец, я настоятельно рекомендую создать набор тестов нагрузки (используя Visual Studio 2008 Test Edition), которые вы можете использовать для имитации поведения вашего приложения при работе с большим количеством запросов. Некоторые узкие места производительности SQL проявляются только в этих условиях, и возможность их воспроизведения значительно облегчает их исправление.

Ответ 3

Индексы могут быть хорошим местом для начала...

Низкие висячие фрукты могут быть сбиты с помощью SQL Server Index мастера настройки.

Ответ 4

Посмотрите на индексы в таблицах, которые делают запрос. Индексы могут потребоваться для определенных полей, которые участвуют в предложении where. Также посмотрите на поля, используемые в соединениях в запросе (если соединения существуют). Если индексы уже существуют, посмотрите на тип индекса.

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

Делайте то, что римский и Энди S упоминали первым, хотя.

Ответ 5

Я не уверен в других базах данных, но для SQL Server я рекомендую План выполнения. Он очень четко (хотя и с большим количеством вертикальной и горизонтальной прокрутки, если у вас нет 400-дюймового монитора!) Показывает, какие шаги вашего запроса втягивают время.

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

После нескольких трюков вы можете обнаружить, что на самом деле нет шагов, которые выделяются из других, то есть все они на 1-2%. Если это так, тогда вам может понадобиться выяснить, есть ли способ сократить объем данных, включенных в ваш запрос, выполнить эти четыре миллиона закрытых заказов на продажу в запросе "Активные заказы клиентов"? Нет, поэтому исключаем всех с STATUS = 'C'... или что-то в этом роде.

Еще одно улучшение, которое вы увидите в плане выполнения, - это поиск по закладкам, в основном он находит совпадение в индексе, но затем SQL Server должен быстро перетащить таблицу, чтобы найти нужную запись. Эта операция может время от времени занимать больше времени, чем просто сканирование таблицы в первую очередь, если бы это было так, вам действительно нужен этот индекс?

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

Ответ 6

Есть несколько вещей, на которые вы можете посмотреть, чтобы оптимизировать производительность вашего запроса.

  • Убедитесь, что у вас есть минимум данных. Убедитесь, что вы выбрали только нужные столбцы. Сократите размеры полей до минимума.

  • Рассмотрим де-нормализацию вашей базы данных для сокращения объединений

  • Избегайте циклов (т.е. курсоров выборки), придерживайтесь заданий.

  • Реализовать запрос как хранимую процедуру, поскольку он предварительно скомпилирован и будет выполняться быстрее.

  • Убедитесь, что у вас установлены правильные индексы. Если ваша база данных используется в основном для поиска, то рассмотрите больше индексов.

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

  • Убедитесь, что для автоматической статистики установлено значение "включено". SQL нуждается в этом, чтобы помочь решить оптимальное выполнение. См. Майк Гундерлой отличный пост для получения дополнительной информации. Основы статистики в SQL Server 2005

  • Убедитесь, что ваши индексы не фрагментированы Уменьшение фрагментации индекса SQL Server

  • Убедитесь, что ваши таблицы не фрагментированы. Как определить фрагментацию таблицы в SQL Server 2000 и 2005

Ответ 7

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

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

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

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