Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 10g - optimiser WHERE IS NOT NULL

L'optimiseur pense que l'analyse complète de la table sera meilleure.

S'il n'y a que quelques NULL lignes, l'optimiseur a raison.

Si vous êtes absolument sûr que l'accès à l'index sera plus rapide (c'est-à-dire que vous avez plus de 75% lignes avec col1 IS NULL ), puis indiquez votre requête :

SELECT  /*+ INDEX (t index_name_on_col1) */
        *
FROM    mytable t
WHERE   col1 IS NOT NULL

Pourquoi 75% ?

Parce qu'utiliser INDEX SCAN récupérer des valeurs non couvertes par l'index implique une jointure masquée sur ROWID , qui coûte environ 4 fois plus que le balayage de table.

Si la plage d'index comprend plus de 25% de lignes, l'analyse de la table est généralement plus rapide.

Comme mentionné par Tony Andrews , le facteur de regroupement est une méthode plus précise pour mesurer cette valeur, mais 25% est toujours une bonne règle de base.