Нет, это может быть неверно.
Если у вас большая таблица, Oracle
может предпочесть получение полей из индексов, а не из таблицы, даже если нет единого индекса, охватывающего все значения.
В последней статье в моем блоге:
, существует запрос, в котором Oracle
не использует полное сканирование таблицы, а объединяет два индекса для получения значений столбца:
SELECT l.id, l.value
FROM t_left l
WHERE NOT EXISTS
(
SELECT value
FROM t_right r
WHERE r.value = l.value
)
План:
SELECT STATEMENT
HASH JOIN ANTI
VIEW , 20090917_anti.index$_join$_001
HASH JOIN
INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID
INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE
INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE
Как видите, здесь нет TABLE SCAN
на t_left
.
Вместо этого Oracle
получает индексы для id
и value
, присоединяет их к rowid
и получает пары (id, value)
из результата объединения.
Теперь по вашему запросу:
SELECT *
FROM some_table
WHERE field_one is not null and field_two = ?
GROUP BY
field_three, field_four, field_five
Во-первых, он не скомпилируется, поскольку вы выбираете *
из таблицы с предложением GROUP BY
.
Вам необходимо заменить *
на выражения, основанные на столбцах группировки и агрегатах столбцов, не входящих в группу.
Скорее всего, вы получите следующий индекс:
CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)
, поскольку он будет содержать все как для фильтрации на field_two
, так и для сортировки на field_three, field_four, field_five
(полезно для GROUP BY
) и проверки того, что field_one
равно NOT NULL
.