Оптимизатор не использует индекс - PullRequest
0 голосов
/ 10 марта 2019
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.

Описание:

В TABLE_4 создан следующий уникальный индекс:

CREATE UNIQUE INDEX DB.CMCX_LTLT_PRIMARY ON DB.TABLE_4 
(LTLT_PFX, ACAC_ACC_NO)

В TABLE_3 создан следующий уникальный индекс:

CREATE UNIQUE INDEX DB.CMCX_PDVC_PRIMARY ON DB.TABLE_3 
(PDPD_ID, PDVC_TIER, PDVC_TYPE, PDVC_EFF_DT, PDVC_SEQ_NO)

enter image description here

Оптимизатор использует полное сканирование таблиц для двух таблиц, даже если для обеих таблиц существуют индексы. Индексы представляют собой многостолбцовые индексы, но порядок столбцов в соответствии с документами SQL Server, и оптимизатор должен использовать индекс. В настоящее время выполнение запроса занимает 40-50 минут.

NB. База данных базы данных принадлежит другой группе, которая не будет принимать никаких запросов на изменение индексов. Единственный вариант - настроить запрос или использовать явные подсказки для использования индекса.

1 Ответ

1 голос
/ 10 марта 2019

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

Поэтому: собирали ли вы статистику и делаете ли вы это регулярно?(Если вы привыкли к другому термину (из предыдущих версий баз данных Oracle), вопрос будет: «Анализировали ли вы индекс?»).

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

Потому что настройка производительности не простая задача - об этом написаны книги.Если бы это было так просто, каждый бы сделал это эффективно.К сожалению, правда как раз наоборот.Если хотите, взгляните на тему «Настройка производительности» на форуме OraFAQ здесь: http://www.orafaq.com/forum/t/84315/. Люди собрали несколько подсказок для нас (людей), чтобы упростить эту задачу.

...