#oracle11g #database-performance
#oracle11g #база данных-производительность
Вопрос:
SELECT DISTINCT
LTLT.LTLT_PFX, LTLT.ACAC_ACC_NO, LTLT.LTLT_DESC, LTLT.LTLT_CAT, LTLT.LTLT_LEVEL,
LTLT.LTLT_PERIOD_IND, LTLT.LTLT_RULE, LTLT.LTLT_IX_IND, LTLT.LTLT_IX_TYPE, LTLT.EXCD_ID,
LTLT.LTLT_AMT1, LTLT.LTLT_AMT2, LTLT.LTLT_OPTS, LTLT.LTLT_SAL_IND, LTLT.LTLT_DAYS, LTLT.WMDS_SEQ_NO,
LTLT.LTLT_LOCK_TOKEN, LTLT.ATXR_SOURCE_ID, LTLT.SYS_LAST_UPD_DTM, LTLT.SYS_USUS_ID, LTLT.SYS_DBUSER_ID,
LTLT.LTLT_EXCL_DED_IND_NVL
FROM AGP.TABLE_1 DISB_CLM
INNER JOIN TABLE_2 CLCL ON DISB_CLM.CLCL_ID = CLCL.CLCL_ID
INNER JOIN TABLE_3 PDVC ON PDVC.PDPD_ID = CLCL.PDPD_ID
INNER JOIN TABLE_4 LTLT ON LTLT.LTLT_PFX = PDVC.LTLT_PFX
Проблема: Оптимизатор не использует индекс, несмотря на составной индекс в TABLE_3 и TABLE_4.
Описание:
В таблице 4 создан следующий уникальный индекс:
CREATE UNIQUE INDEX DB.CMCX_LTLT_PRIMARY ON DB.TABLE_4
(LTLT_PFX, ACAC_ACC_NO)
В таблице 3 создан следующий уникальный индекс:
CREATE UNIQUE INDEX DB.CMCX_PDVC_PRIMARY ON DB.TABLE_3
(PDPD_ID, PDVC_TIER, PDVC_TYPE, PDVC_EFF_DT, PDVC_SEQ_NO)
Оптимизатор использует полное сканирование таблицы для двух таблиц, даже если индексы существуют для обеих таблиц. Индексы представляют собой многоколоночные индексы, но порядок следования столбцов
соответствует документам SQL Server, и оптимизатор должен использовать индекс. Выполнение запроса в настоящее время занимает 40-50 минут.
ПРИМЕЧАНИЕ: База данных DB принадлежит другой команде, которая не принимала бы никаких запросов на изменение индексов. Единственный вариант — настроить запрос или использовать явные подсказки для использования индекса.
Комментарии:
1. Спасибо за правку @James Z
Ответ №1:
Оптимизатор — это что-то вроде искусственного интеллекта. Он принимает решения на основе имеющейся у него информации. Если эта информация точна и актуальна, то решение, скорее всего, будет хорошим.
Итак: собирали ли вы статистику и делаете ли вы это регулярно? (Если вы привыкли к другому термину (из предыдущих версий базы данных Oracle), вопрос будет «вы анализировали индекс?»).
Если статистика в порядке, и если оптимизатор все равно использует полное сканирование таблицы, обратите внимание, что полное сканирование таблицы не является злом. Бывают ситуации, когда это дает лучший результат, чем тот, с индексом. Если вы хотите заставить его использовать это, то примените соответствующую подсказку. Обычно говорят, что если вы не знаете, что делаете, не используйте подсказки, поскольку вы можете ухудшить ситуацию.
Потому что настройка производительности — непростая задача — об этом написаны книги. Если бы это было так просто, каждый делал бы это эффективно. К сожалению, на самом деле все как раз наоборот. Если вы хотите, ознакомьтесь с темой «Настройка производительности» на форуме OraFAQ, здесь:http://www.orafaq.com/forum/t/84315 /. Люди собрали несколько подсказок для нас (людей), чтобы несколько упростить эту задачу.