2015-04-24 3 views
1

У меня есть запрос похож на это:Использование индекса для ускорения ребенка <> родительского запроса

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

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

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

ответ

1

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

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 может делать полное сканирование таблицы.

+0

Благодарим за информацию. Эта таблица имеет уже несколько индексов, и использование DECODE позволяет выполнять INDEX SKIP SCAN с DECODE и столбцом состояния в качестве фильтров данных. –

0

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

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