Неправильный индекс выбран Oracle - PullRequest
0 голосов
/ 21 ноября 2011

У меня проблема с индексацией в Oracle. Постараюсь объяснить мою проблему с помощью примера следующим образом.

У меня есть таблица TABLE1 со столбцами A, B, C, D Другая таблица TABLE2 с колонками A, B, C, E, F, H

Я создал индексы для TABLE1

IX_1 A
IX_2 A,B
IX_3 A,C
IX_4 A,B,C

Я создал индексы для TABLE1

IY_1 A,B,C
IY_2 A

когда я дал запрос, похожий на этот

SELECT * FROM TABLE1 T1,TABLE2 T2
WHERE T1.A=T2.A

Когда я даю объяснительный план, я получаю, что он не получает IX_1 и IY_2

Он принимает IX_4, ни IY_1

почему это не правильный указатель?

РЕДАКТИРОВАНИЕ:

Может кто-нибудь помочь мне узнать разницу между INDEX RANGE SCAN, INDEX UNIQUE SCAN, INDEX SKIP SCAN

Я думаю, SKIP SCAN означает, что когда Oracle пропускает столбец в составном индексе

что насчет других, я понятия не имею!

1 Ответ

3 голосов
/ 21 ноября 2011

Наилучшим преимуществом индексов является то, что вы можете выбрать несколько строк из таблицы без сканирования всей таблицы. Если вы запрашиваете слишком много строк (скажем, 30% - зависит от многих вещей), движок предпочтет отсканировать всю таблицу на наличие этих строк. Это связано с тем, что чтение строки с использованием индекса становится трудоемким: чтение некоторых блоков индекса и после этого чтение блоков таблицы.

В вашем случае, для объединения таблиц T1 и T2 Oracle нужны все строки из этой таблицы. Чтение (полное) индекса будет бесполезной операцией, добавляя ненужные затраты.

ОБНОВЛЕНИЕ : шаг вперед: если вы запустите:

SELECT T1.B, T2.B FROM TABLE1 T1,TABLE2 T2
WHERE T1.A=T2.A

Oracle, вероятно, будет использовать индексы (IX2, IY2), потому что ему не нужно ничего читать из таблицы, поскольку значения T1.B, T2.B, равны в индексах.

...