Lets dire que vous avez une table Oracle:Comment utiliser un index basé sur une fonction sur une colonne contenant des valeurs NULL dans Oracle 10+?
CREATE TABLE person (
id NUMBER PRIMARY KEY,
given_names VARCHAR2(50),
surname VARCHAR2(50)
);
avec ces fonctions basée sur les indices:
CREATE INDEX idx_person_upper_given_names ON person (UPPER(given_names));
CREATE INDEX idx_person_upper_last_name ON person (UPPER(last_name));
Maintenant, given_names n'a pas de valeur NULL mais pour le last_name cause de l'argument fait. Si je fais ceci:
SELECT * FROM person WHERE UPPER(given_names) LIKE 'P%'
le plan me dit expliquer son utilisation de l'index, mais changer pour:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%'
il ne fonctionne pas. Les documents Oracle indiquent que l'utilisation de l'index basé sur la fonction ne sera utilisée que lorsque plusieurs conditions sont remplies, dont l'une est de s'assurer qu'il n'y a pas de valeurs NULL puisqu'elles ne sont pas indexées.
J'ai essayé ces requêtes:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND UPPER(last_name) IS NOT NULL
et
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND last_name IS NOT NULL
Dans ce dernier cas, j'ai même ajouté un index sur last_name mais peu importe ce que j'essayer utilise un scan de table. En supposant que je ne peux pas me débarrasser des valeurs NULL, comment puis-je obtenir cette requête pour utiliser l'index sur UPPER (last_name)?
Combien de lignes avez-vous réellement dans la table? Pouvez-vous poster le plan d'explication pour l'analyse complète de la table et aussi quand il choisit d'utiliser l'index (vous devrez peut-être l'indiquer ou changer la colonne pour NON NULL pour les besoins de l'exercice). –