Comment utiliser une fonction de base de l'index sur une colonne contenant des valeurs Null dans Oracle 10+?

Permet simplement de dire que vous avez une table Oracle:

CREATE TABLE person (
  id NUMBER PRIMARY KEY,
  given_names VARCHAR2(50),
  surname VARCHAR2(50)
);

avec fonction de ces 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 a pas de valeurs NULL, mais pour la commodité du raisonnement nom ne. Si je fais ceci:

SELECT * FROM person WHERE UPPER(given_names) LIKE 'P%'

l'expliquer plan me raconte son à l'aide de l'index, mais le modifier:

SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%'

il ne le fait pas. L'Oracle docs disent que l'utilisation de la fonction d'index de base ne sera utilisé que lorsque plusieurs conditions sont remplies, un est de s'assurer il n'y a pas de valeurs NULL, car ils ne sont pas indexés.

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 le nom, mais peu importe ce que j'essaie il utilise un full table scan. En supposant que je ne peut pas se débarrasser de l de valeurs NULL, comment puis-je obtenir cette requête à utiliser l'index sur la partie SUPÉRIEURE(nom)?

Combien de lignes dans la table? Pouvez-vous poster le plan pour expliquer l'intégralité de la table d'analyse, et aussi lorsqu'il ne choisissez d'utiliser l'index (vous pourriez avoir à faire des allusions ou de modifier la colonne not NULL pour les besoins de l'exercice).

OriginalL'auteur cletus | 2008-10-07