Bonjour,
Pour des raisons d'étude sur les index Oracle, je voudrais créer un index MAIS qui n'indexe QUE la valeur NULL d'une colonne.
Quel intérêt? Imaginons une table de 10 000 000 de rows avec seulement 100 rows avec Col10 à NULL et le reste des rows avec la valeur 1 (c'est juste un cas d'école).
Si je fais un SELECT avec la clause WHERE Col10 IS NULL, Oracle fera un Full Table Scan extrêmement coûteux. Pour éviter cela, j'indexe non pas Col10, car les rows avec NULL seront absents, mais je crée un indexe composite sur (Col1, 1).
Et là, cool, le plan d'exécution montre un prédicat d'accès IS NULL à ces rows via l'index et non pas un prédicat de filtre.
Maintenant je voudrais indexer uniquement la valeur NULL. Pourquoi? Faire sauter un ou deux niveaux de branches donc rendre l'index plus désirable pour le CBO car plus rapide à parcourir et puis avoir un index plus léger pour RMAN et Datapump car réduit à 100 rows.
J'ai donc voulu créer un index sur fonction : si col10 is null then return col10,1 sinon return null, null;
Pb : ça ne passe pas, je me heurte à des contraintes PL/SQL; pour qu'une fonction retourne N valeurs il faut créer un type objet ou utiliser un array de deux valeurs (ce que j'arrive à faire). MAIS, ensuite, impossible de créer un index en se basant sur cette fonction...
Voilà, si vous avez des idées je suis preneur
Dans le "pire" des cas, où cela n'est pas possible, peut-être que créer une partition pour mes 100 rows serait une solution... à voir
Partager