Использование индекса для ускорения дочернего <> родительского запроса

У меня есть запрос, похожий на этот:

select *
from table1
where status = 'ACTV'
and child_id <> parent_id

Проблема в том, что эта таблица довольно большая и Oracle выполняет полное сканирование таблицы. Я пытался создать индекс (со столбцами status, child_id, parent_id), который ускорил бы этот запрос, но Oracle не использует этот индекс даже с подсказкой.

Есть ли способ ускорить этот запрос?

2 ответа

Решение

Вы можете использовать индекс с функцией:

CREATE INDEX child_parent ON table1(DECODE(child_id,parent_id,1, 0))

И затем используйте это в своем выборе:

select *
from table1
where status = 'ACTV'
  and DECODE(child_id,parent_id,1, 0) = 0

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

В родительской, дочерней таблице: "child_id <> parent_id", очевидно, верно, она всегда будет извлекать 99% данных, тогда лучше будет использовать полное сканирование таблицы. Индекс будет медленнее, если вы выберете больший процент данных.

если вашему приложению всегда требуется "child_id <> parent_id", тогда вы можете создать проверку ограничений для того же самого. Тогда вам может не понадобиться это когда условие "child_id <> parent_id" в любое время.

Другие вопросы по тегам