Поиск по двум столбцам в составном индексе из трех столбцов - Oracle - PullRequest
4 голосов
/ 21 августа 2009

У меня есть составной индекс на три столбца в одной из моих таблиц. Это работает найти, если у меня есть три столбца в где закрыть моего запроса. Когда в моем поисковом запросе только два из трех, кажется, что все уже не так быстро!

Вы знаете, как это обойти?

Спасибо

Tam

P.S. Стол

APPL_PERF_STATS

имеет составной индекс (current_appl_id, event_name & generic_method_name) Этот занял 2 минуты (используя все столбцы в составном индексе):

SELECT * FROM APPL_PERF_STATS WHERE (GENERIC_METHOD_NAME! = 'NULL' И CURRENT_APPL_ID! = 'NULL' И EVENT_NAME! = 'NULL') И ROWNUM <502 И current_appl_id = 'OMS' И event_name = 'OMS-CeaseProduct' И generic_method_name = 'CE CallForwardFixedCOProduct' И appl_perf_interval_typ_id = 1440 AND cover_period_start_ts> = to_date ('20 -07-2008 14:36 ​​',' dd-mm-yyyy HH24: mi ') И cover_period_start_ts <= to_date ('19 -08-2009 14:36 ​​',' дд-мм-гггг HH24: mi ') ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS </p>

Для выполнения этой задачи потребовалось 12 минут (используя только 2 из трех в составном индексе):

SELECT * FROM APPL_PERF_STATS WHERE (GENERIC_METHOD_NAME! = 'NULL' И CURRENT_APPL_ID! = 'NULL' И EVENT_NAME! = 'NULL') И ROWNUM <502 И current_appl_id = 'OMS' И event_name = 'OMS-CeaseProduct' И appl_perf_interval_typ_id = 1440 AND cover_period_start_ts> = to_date ('20 -07-2008 14:36 ​​',' dd-mm-yyyy HH24: mi ') И cover_period_start_ts <= to_date ('19 -08-2009 14:36 ​​',' дд-мм-гггг HH24: mi ') ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS </p>

Ответы [ 2 ]

4 голосов
/ 21 августа 2009
  • Вы знаете, по каким двум из трех терминов вы будете искать? Для максимальной эффективности Oracle будет использовать индексы только в тех случаях, когда вы запрашиваете ведущие столбцы индекса. Таким образом, индекс для (column_1, column_2, column_3) может использоваться с такой же эффективностью для запросов на column_1 и column_2, как и для запросов ко всем трем. Однако при поиске по column_2 и column_3 (как минимум) наблюдается значительное снижение эффективности, поскольку это не ведущие столбцы.
  • Какую версию Oracle вы используете? В зависимости от версии Oracle и селективности ведущего столбца, Oracle может использовать так называемые «сканирования с пропуском индекса», чтобы использовать индекс, если ваши запросы не включают в себя ведущий столбец (столбцы) индекса. Это будет менее эффективно, чем обычное сканирование диапазона индекса, но может быть более эффективным, чем сканирование таблицы.
  • Каков план запроса на запросы, которые не так быстры, как вы надеетесь? Мы можем догадаться, что может сделать оптимизатор, но гораздо эффективнее увидеть фактический план запроса.
3 голосов
/ 21 августа 2009

"Когда в моем поисковом запросе только два из трех, кажется, что все уже не так быстро!" А ты ожидал чего-то еще?

Если вам нужно было позвонить всем «Смит, Джон» в телефонной книге, у вас может быть 50 записей, и это займет 5 часов. Если вы наберете все записи «Смит» в телефонной книге, у вас может быть 500 записей, и это займет в десять раз больше времени.

Реальный вопрос в том, какие объемы данных вы ожидаете обработать, является ли производительность приемлемой / приемлемой.

Глядя на запрос, можно выбрать индексирование cover_period_start_ts и / или appl_perf_interval_typ_id, отдельно или в сочетании с другими столбцами. Я подозреваю, что много времени тратится на поиск строки, соответствующей критериям индекса, переход к таблице, а затем отклонение строки, поскольку отметка времени или интервал не соответствуют указанным критериям.

PS. если вы посмотрите на запрос, то увидите, что все три столбца указаны в части! = 'NULL' предложения where, поэтому технически он использует все три столбца индекса, но два - как access_predicate, а один - как фильтр_предикат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...