Когда использовать подсказки в запросе оракула

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

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

Этот ответ Дэвида очень хороший, но я был бы признателен, если бы кто-то разъяснил это более подробно.

3 ответа

Большинство подсказок - это способ сообщить о наших намерениях оптимизатору. Например, leading Подсказка, которую вы упомянули, означает объединение таблиц в этом порядке. Почему это необходимо? Часто это происходит из-за того, что оптимальный порядок соединения неочевиден, потому что запрос плохо написан или статистика базы данных неточна.

Так что одно использование подсказок, таких как leading это выяснить лучший путь выполнения, а затем выяснить, почему база данных не выбирает этот план без подсказки. Сбор свежей статистики решает проблему? Решает ли переписывание предложения FROM проблему? Если это так, мы можем удалить подсказки и развернуть голый SQL.

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

Но есть и другие намеки, которые мы не моргнем, чтобы увидеть в Production. append часто имеет решающее значение для настройки объемных вставок. driving_site может быть жизненно важным в настройке распределенных запросов.

И наоборот, другие намеки почти всегда злоупотребляют. да parallel, Я говорю о тебе. Слепо положить /*+ parallel (t23, 16) */ вероятно, ваш запрос не будет выполняться в шестнадцать раз быстрее, и нередко это приведет к более медленному поиску, чем однопоточное выполнение.

Итак, короче говоря, нет универсально применимого совета, когда нам следует использовать подсказки. Ключевые вещи:

  1. понять, как работает база данных, и особенно, как работает оптимизатор на основе затрат;
  2. понять, что делает каждый намек;
  3. тестируйте подсказки в правильной среде настройки с данными, эквивалентными производственным.

Очевидно, что лучшее место для начала - документация Oracle. Однако, если вам захочется потратить немного денег, книга Джонатана Льюиса " Оптимизатор на основе затрат" - это лучшее вложение, которое вы можете сделать.

Я не мог просто перефразировать это, поэтому я вставлю это сюда (это краткое объяснение "Когда не использовать подсказки", которое я добавил в закладки):

Таким образом, не используйте подсказки, когда

  1. То, что делает подсказка, плохо понято, что, конечно, не ограничивается (ab) использованием подсказок;

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

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

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

  5. Вы не собираетесь документировать использование подсказок в любом случае.

Ссылка на источник здесь.

Я могу резюмировать это следующим образом: использование подсказок - это не только последнее средство, но и недостаток знаний о первопричине проблемы. CBO (Cost Based Optimizer) делает отличную работу, если вы просто обеспечите некоторые основы для этого. К ним относятся:

  1. Свежая статистика 1.1. Индекс статистики 1.2. Таблица статистики 1.3. Гистограммы
  2. Правильный JOIN условия и INDEX использование
  3. Правильные настройки базы данных

Здесь стоит прочитать эту статью: 10 главных причин низкой производительности Oracle

Представлено не другим, а мистером Дональдом Берлесоном.

ура

В целом подсказки следует использовать только в исключительных случаях, я знаю следующие ситуации, в которых они имеют смысл:

Обход ошибок Oracle

Пример: однажды для оператора SELECT я получил ошибку ORA-01795: maximum expression number in list - 1000, хотя запрос вообще не содержал выражения IN.

Проблема заключалась в том, что запрашиваемая таблица содержит более 1000 (под) разделов, и Oracle произвел преобразование моего запроса. Использование (недокументированной) подсказки NO_EXPAND_TABLE решил проблему.

Приложение Datewarehouse во время постановки

Во время подготовки вы можете внести существенные изменения в свои данные, когда статистика таблиц / индексов не известна, поскольку по умолчанию статистика собирается только один раз в неделю. Если вы знаете свою структуру данных, то подсказки могут быть полезны, поскольку они работают быстрее DBMS_STATS.GATHER_TABLE_STATS(...) вручную все время между вашими операциями. С другой стороны, вы можете запустить DBMS_STATS.GATHER_TABLE_STATS() даже для отдельных столбцов, которые могут быть лучшим подходом.

Советы по обновлению приложения в Интернете

Из документации Oracle:

CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, а также RETRY_ON_ROW_CHANGE подсказки отличаются от других подсказок тем, что они имеют смысловой эффект. Общая философия, описанная в "Подсказках", не относится к этим трем подсказкам.

Другие вопросы по тегам