2010-11-14 11 views
1

J'ai une requête qui fonctionne assez bien pour un nombre limité de ROWNUMS mais une fois qu'elle dépasse ce ROWNUM particulier, elle est très mauvaise.PLSQL Fonction utilisée dans where clause - Performance Issue

Ci-dessous la requête:

SELECT p.col1,pv.col1 FROM tab1 p, tab2 tv, tab3 pv WHERE myFunc(pv.col1) = 1 AND tv.col1 = pv.col1 AND p.col1 = tv.col2 AND ROWNUM < 4500

Toutes ces tables ont d'énormes (plus d'un million) dossiers.

La requête ci-dessus s'exécute à une vitesse très correcte.

Si ROWNUM < 5000 ou plus alors cela prend beaucoup de temps.

Y at-il un moyen d'améliorer les performances de la requête ci-dessus?

+0

sont les colonnes que vous avez rejoint indexé sur les trois tableaux? – diederikh

+0

Il serait utile de savoir ce que 'myFunc' fait. –

+0

Vous devriez examiner (et ajouter à votre question) le PLAN EXPLAIN pour l'instruction avec 'ROWNUM <1000' et l'instruction avec' ROWNUM <10000'. Sont-ils différents et comment? La fonction peut être appelée au début du plan, ou en retard, ce qui peut affecter la performance. Alternativement, la fonction peut ne rien avoir à faire avec le problème de performance. –

Répondre

1

Vérifiez qu'il existe des indices sur chaque colonnes de jointure sur chaque table, et après cela, vous pouvez utiliser les index fonctionnels, voir par exemple: http://techonthenet.com/oracle/indexes.php

+0

+1 pour les index fonctionnels –