Использование индекса для ускорения дочернего <> родительского запроса
У меня есть запрос, похожий на этот:
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" в любое время.