2015-04-24 1 views
1

J'ai requête similaire à ceci:Utiliser index pour accélérer l'enfant <> parent recherche

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

Le problème est que ce tableau est assez gros et Oracle est en train de faire l'analyse complète de la table. J'essayais de créer un index (avec les colonnes status, child_id, parent_id) qui accélérerait cette requête mais Oracle n'utilise pas cet index même avec hint.

Existe-t-il un moyen d'accélérer cette requête?

Répondre

1

Vous pouvez utiliser l'index avec la fonction:

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

Et puis utilisez dans votre sélection:

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

seulement contre cette solution - il va ralentir insérer et mettre à jour des opérations un peu plus que l'index régulier. Aussi si le nombre d'enregistrements potentiellement retournables est grand Oracle peut effectuer une analyse complète de table

+0

Merci pour l'information. Cette table a déjà quelques index et l'utilisation de DECODE permet de faire un INDEX SKIP SCAN avec DECODE et une colonne d'état comme filtres de données. –

0

En parent, table enfant: "child_id <> parent_id" est évident à droite, il récupérera toujours 99% des données puis le balayage de table complet est une meilleure approche . L'index sera plus lent si vous sélectionnez plus de pourcentage de données. Si votre application nécessite "child_id <> parent_id", vous pouvez toujours créer une contrainte de vérification pour cette application. Ensuite, vous ne pouvez pas besoin de cette condition où "child_id <> parent_id" à tout moment.