Когда использовать подсказки в запросе оракула
Я просмотрел некоторую документацию в сети, и использование подсказок в основном не рекомендуется. У меня все еще есть сомнения по этому поводу. Могут ли советы быть действительно полезными в производстве, особенно когда один и тот же запрос используется сотнями разных клиентов.
Полезен ли намек только тогда, когда мы знаем количество записей в таблицах? В своем запросе я использую лидирующее значение, и оно дает более быстрые результаты, когда данные очень большие, но производительность не так велика, когда извлекаемые записи меньше.
Этот ответ Дэвида очень хороший, но я был бы признателен, если бы кто-то разъяснил это более подробно.
3 ответа
Большинство подсказок - это способ сообщить о наших намерениях оптимизатору. Например, leading
Подсказка, которую вы упомянули, означает объединение таблиц в этом порядке. Почему это необходимо? Часто это происходит из-за того, что оптимальный порядок соединения неочевиден, потому что запрос плохо написан или статистика базы данных неточна.
Так что одно использование подсказок, таких как leading
это выяснить лучший путь выполнения, а затем выяснить, почему база данных не выбирает этот план без подсказки. Сбор свежей статистики решает проблему? Решает ли переписывание предложения FROM проблему? Если это так, мы можем удалить подсказки и развернуть голый SQL.
Иногда бывают случаи, когда мы не можем разрешить эту головоломку, и нам приходится держать намеки в Production. Однако это должно быть редким исключением. У Oracle было много очень умных людей, которые много лет работали над оптимизатором затрат, поэтому его решения обычно лучше наших.
Но есть и другие намеки, которые мы не моргнем, чтобы увидеть в Production. append
часто имеет решающее значение для настройки объемных вставок. driving_site
может быть жизненно важным в настройке распределенных запросов.
И наоборот, другие намеки почти всегда злоупотребляют. да parallel
, Я говорю о тебе. Слепо положить /*+ parallel (t23, 16) */
вероятно, ваш запрос не будет выполняться в шестнадцать раз быстрее, и нередко это приведет к более медленному поиску, чем однопоточное выполнение.
Итак, короче говоря, нет универсально применимого совета, когда нам следует использовать подсказки. Ключевые вещи:
- понять, как работает база данных, и особенно, как работает оптимизатор на основе затрат;
- понять, что делает каждый намек;
- тестируйте подсказки в правильной среде настройки с данными, эквивалентными производственным.
Очевидно, что лучшее место для начала - документация Oracle. Однако, если вам захочется потратить немного денег, книга Джонатана Льюиса " Оптимизатор на основе затрат" - это лучшее вложение, которое вы можете сделать.
Я не мог просто перефразировать это, поэтому я вставлю это сюда (это краткое объяснение "Когда не использовать подсказки", которое я добавил в закладки):
Таким образом, не используйте подсказки, когда
То, что делает подсказка, плохо понято, что, конечно, не ограничивается (ab) использованием подсказок;
Вы не изучили основную причину плохого кода SQL и, таким образом, еще не воспользовались обширным опытом и знаниями вашего администратора баз данных в настройке базы данных;
Ваша статистика устарела, и вы можете обновлять статистику чаще или даже зафиксировать статистику в репрезентативном состоянии;
Вы не намерены регулярно проверять правильность подсказок в своих утверждениях, а это означает, что при изменении статистики подсказка может оказаться крайне неадекватной;
Вы не собираетесь документировать использование подсказок в любом случае.
Ссылка на источник здесь.
Я могу резюмировать это следующим образом: использование подсказок - это не только последнее средство, но и недостаток знаний о первопричине проблемы. CBO (Cost Based Optimizer) делает отличную работу, если вы просто обеспечите некоторые основы для этого. К ним относятся:
- Свежая статистика 1.1. Индекс статистики 1.2. Таблица статистики 1.3. Гистограммы
- Правильный
JOIN
условия иINDEX
использование - Правильные настройки базы данных
Здесь стоит прочитать эту статью: 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()
даже для отдельных столбцов, которые могут быть лучшим подходом.
Советы по обновлению приложения в Интернете
CHANGE_DUPKEY_ERROR_INDEX
,IGNORE_ROW_ON_DUPKEY_INDEX
, а такжеRETRY_ON_ROW_CHANGE
подсказки отличаются от других подсказок тем, что они имеют смысловой эффект. Общая философия, описанная в "Подсказках", не относится к этим трем подсказкам.