Digamos que tiene una tabla en Oracle:¿Cómo usar un índice basado en funciones en una columna que contiene NULLs en Oracle 10+?
CREATE TABLE person (
id NUMBER PRIMARY KEY,
given_names VARCHAR2(50),
surname VARCHAR2(50)
);
con estos índices basados en funciones:
CREATE INDEX idx_person_upper_given_names ON person (UPPER(given_names));
CREATE INDEX idx_person_upper_last_name ON person (UPPER(last_name));
Ahora, given_names no tiene valores NULL pero para last_name motivo de la discusión hace. Si hago esto:
SELECT * FROM person WHERE UPPER(given_names) LIKE 'P%'
al explicar el plan me dice su utilizando el índice, pero cambiarlo a:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%'
no lo hace. Los documentos de Oracle dicen que usar el índice basado en funciones solo se usará cuando se cumplan varias condiciones, una de las cuales es garantizar que no haya valores NULOS ya que no están indexadas.
que he probado estas consultas:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND UPPER(last_name) IS NOT NULL
y
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND last_name IS NOT NULL
En este último caso, incluso he añadido un índice en last_name pero no importa lo que intento que utiliza un escaneo completo de tabla. Suponiendo que no puedo deshacerme de los valores NULL, ¿cómo obtengo esta consulta para usar el índice en UPPER (last_name)?
¿Cuántas filas realmente tiene en la tabla? ¿Puede publicar el plan de explicación para el escaneo completo de la tabla y también cuando elige usar el índice (es posible que deba insinuarlo o cambiar la columna a NOT NULL para los fines del ejercicio). –