2008-09-14 2 views
10

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

Связанные Вопрос:
What generic techniques can be applied to optimize SQL queries?

+0

Выглядит очень похож на [более ранний вопрос] (http://stackoverflow.com/questions/39331/what-generic-techniques-can-be-applied-to-optimize-sql-queries#39344). – Unsliced 2008-09-14 07:23:53

ответ

14
  1. Посмотрите на план выполнения в анализатор запросов
  2. Смотрите, что шаг стоит наиболее
  3. Оптимизация шаг!
  4. Вернуться к шагу 1 [ТНХ к Винко]
+0

4 следует читать «Перейти к шагу 1» – 2008-09-14 01:44:21

+1

Это цикл и цикл в sql. :) Я ребенок .. Я парень .. Люблю этот ответ. – 2008-09-14 02:52:31

3

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

Низкий висящие плоды могут быть сбиты с SQL Server Index Tuning Мастер.

+0

Я согласен, что это может быть хорошим местом для начала, но через некоторое время я обнаружил, что он немного конфликтует с самим собой. Он хочет удалить индексы, созданные для предыдущей попытки настройки. – 2008-09-14 04:09:11

2

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

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

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

7

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

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

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

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

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

1

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

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

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

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

2

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

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

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

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

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

2

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

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

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

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

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

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

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

  7. Убедитесь, что для параметра «Автоматическая статистика» установлено значение «включено». SQL нуждается в этом, чтобы помочь решить оптимальное выполнение. См. Большой пост Майка Гундерлой для получения дополнительной информации. Basics of Statistics in SQL Server 2005

  8. Убедитесь, что индексы не фрагментирован Reducing SQL Server Index Fragmentation

  9. Убедитесь, что ваши таблицы не раздроблена. How to Detect Table Fragmentation in SQL Server 2000 and 2005