Какие общие методы можно применять для оптимизации запросов SQL? - PullRequest
13 голосов
/ 02 сентября 2008

Какие методы можно эффективно применять для повышения производительности SQL-запросов? Существуют ли общие правила, которые применяются?

Ответы [ 11 ]

18 голосов
/ 02 сентября 2008
  • Использовать первичные ключи
  • Избегайте выбора *
  • Будьте максимально конкретны при построении ваших условных выражений
  • Денормализация часто может быть более эффективной
  • Переменные и временные таблицы (если они есть) часто лучше, чем использование большой исходной таблицы
  • Разделенные виды
  • Индексы занятости и ограничения
7 голосов
/ 02 сентября 2008

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

  • Индексы (не только то, что они есть, но на самом деле, как они работают).
  • Кластерные индексы и таблицы, выделенные для кучи.
  • Текстовые и двоичные поиски и когда они могут быть встроены.
  • Коэффициент заполнения .
  • Как записи предоставляются для обновления / удаления.
  • Когда происходит разбиение страницы и почему.
  • Статистика и как они влияют на различные скорости запросов.
  • Планировщик запросов и то, как он работает для вашей конкретной базы данных (например, в некоторых системах «select *» работает медленно, на современных БД MS-Sql планировщик может его обработать).
3 голосов
/ 02 сентября 2008

Самая большая вещь, которую вы можете сделать, - это искать сканирование таблиц в анализаторе запросов sql server (убедитесь, что вы включили «показывать план выполнения»). В противном случае в MSDN и других местах есть множество статей, которые дадут полезные советы.

Кроме того, когда я начал учиться оптимизировать запросы, я запустил средство трассировки запросов sql server против трассировки, посмотрел на сгенерированный SQL и попытался выяснить, почему это стало лучше. Профилировщик запросов далеко не оптимален, но это неплохое начало.

2 голосов
/ 14 сентября 2008

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

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

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

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

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

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

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

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

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

  9. Убедитесь, что ваши таблицы не фрагментированы. Как обнаружить фрагментацию таблицы в SQL Server 2000 и 2005
1 голос
/ 17 сентября 2008

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

WITH
master AS
(
    SELECT SSN, FIRST_NAME, LAST_NAME
    FROM MASTER_SSN
    WHERE STATE = 'PA' AND
          GENDER = 'M'
),
taxReturns AS
(
    SELECT SSN, RETURN_ID, GROSS_PAY
    FROM MASTER_RETURNS
    WHERE YEAR < 2003 AND
          YEAR > 2000
)
SELECT *
FROM master,
     taxReturns
WHERE master.ssn = taxReturns.ssn

Подзапросы в операторе with могут заканчиваться так же, как и встроенные представления, или автоматически сгенерированные временные таблицы. В данных о розничной торговле, которые я выполняю, я нахожу, что примерно в 70-80% случаев наблюдается повышение производительности.

100% времени, выгода от обслуживания.

0 голосов
/ 17 мая 2013

Некоторые другие моменты (мои основаны на SQL-сервере, так как каждый бд-база данных имеет свои собственные реализации, которые они могут или не могут иметь место для всех баз данных):

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

Создайте таблицы с использованием правильных типов данных, чтобы избежать необходимости применять к ним функции для вывода данных. Гораздо сложнее вычислить дату, когда вы сохраняете свои данные, например, как varchar.

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

Если ваши условия WHERE или JOIN включают операторы OR (которые работают медленнее), вы можете получить лучшую скорость, используя оператор UNION.

UNION ALL работает быстрее, чем UNION, если (и только если) два параметра взаимоисключающие и в любом случае возвращают одинаковые результаты.

NOT EXISTS обычно быстрее, чем NOT IN или использует левое соединение с предложением WHERE ID = null

В запросе UPDATE добавьте условие WHERE, чтобы убедиться, что вы не обновляете значения, которые уже равны. Разница между обновлением 10 000 000 записей и 4 может быть весьма значительной!

Подумайте о предварительном расчете некоторых значений, если вы будете часто их запрашивать или для больших отчетов. Сумма значений в заказе должна быть сделана только тогда, когда заказ выполнен или скорректирован, а не при суммировании результатов 10 000 000 миллионов заказов в отчете. Предварительные расчеты следует выполнять в триггерах, чтобы они всегда были актуальными и лежали в основе изменений данных. И это не обязательно должны быть просто числа, у нас есть вычисляемое поле, объединяющее имена, которые мы используем в отчетах.

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

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

Форматирование обычно выполняется быстрее в пользовательском интерфейсе, чем в SQL.

Не возвращайте больше данных, чем вам действительно нужно.

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

Очень плохая идея создавать представления, которые вызывают другие представления, которые вызывают другие представления. Вы можете обнаружить, что присоединяетесь к одной и той же таблице 6 раз, когда вам нужно только один раз, и создаете 100 000,00 записей в базовом представлении, чтобы получить 6, которые находятся в вашем конечном результате.

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

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

И поскольку это нельзя сказать слишком часто, используйте индексы правильно, не слишком много или слишком мало. И сделайте ваши предложения WHERE саргабельными (умеющими использовать индексы).

0 голосов
/ 02 сентября 2008
  • Индексы
  • Статистика
  • в стеке Microsoft, помощник по настройке ядра СУБД
0 голосов
/ 02 сентября 2008

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

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

0 голосов
/ 02 сентября 2008

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

0 голосов
/ 02 сентября 2008

В Oracle вы можете посмотреть план объяснения , чтобы сравнить варианты вашего запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...