Заставить Oracle использовать индекс первичного ключа без использования подсказок - PullRequest
3 голосов
/ 29 декабря 2011

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

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

Ответы [ 2 ]

6 голосов
/ 29 декабря 2011

Две наиболее распространенные причины запроса, не использующего индексы:

  1. Полное сканирование таблицы выполняется быстрее.
  2. Плохая статистика.

Если ваши запросы выбирают все таблицы или выполняют объединения, не упоминая первичный ключ в предложении where и т. Д., Скорее всего, будет быстрее выполнить полное сканирование. Без запроса и индексов, а также, предпочтительно, плана объяснения невозможно сказать наверняка.

Однако я бы порекомендовал вам попросить своего администратора баз данных повторно собрать - я надеюсь, если не собрать впервые - статистику в таблице. Используйте dbms_stats.gather_table_stats с расчетным процентом 25% +.

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

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

2 голосов
/ 29 декабря 2011

Вы можете использовать подсказки без изменения SQL, используя профили SQL.Оберните ваши подсказки в профиль SQL, который вступает в силу для этого конкретного идентификатора SQL.

Я понимаю, что у вас нет контроля над SQL, у меня есть много приложений, где я сталкиваюсь с таким же ограничением.После проверки структуры запросов и статистики, как в посте Бена, вы доказали, что намеки на использование индекса повысят производительность, почему бы не попробовать вручную созданный профиль SQL.

У Кристиана Антогнини есть отличная статья здесь о профилях SQL и их создании вручную.В статье упоминается, что создание профилей SQL вручную не имеет документов.Я бы согласился без документов, но это не обязательно означает без поддержки.Я бы сказал, что документации там мало, но если вам нужны доказательства того, что Oracle позволяет создавать вручную, проверьте API или посмотрите файл coe_xfr_sql_profile.sql в каталоге утилит SQLT .

Я также опубликовал таблицу с инструкциями по быстрому созданию профиля SQL вручную здесь .

...