Oracle no usa el índice cuando> se usa en la cláusula Where
-
16-10-2019 - |
Pregunta
Tenemos un escenario relativamente clásico donde la cláusula de fecha de la consulta generada por la aplicación utiliza un "mayor que" para una fecha determinada.
Debido a que no hay una cláusula final para el rango de fechas, Oracle no elige usar el índice de fecha y termina haciendo un escaneo de tabla muy costoso. Sin embargo, sabemos que estos datos son temporales, por lo que sabemos que no hay datos en el futuro. Entonces, si modificamos el SQL para incluir una fecha de finalización del sistema para el período de tiempo, la consulta usa el índice y se vuelve muy barato.
Desafortunadamente, debido a un error en la aplicación que utilizamos, no podemos cambiar la aplicación. Entonces, ¿hay alguna forma en Oracle de que pueda "enseñar" a Oracle de que los datos máximos en esa tabla son hoy, por lo que puede tomar una decisión inteligente o es la única forma real de resolver este problema a nivel de base de datos para fijar el fijo ¿plan?
RGDS, Dan
(Oracle 10 Solaris SPARC)
Solución
Oracle debería poder usar las estadísticas para determinar los valores altos y bajos para cualquier columna si los mantiene actualizado:
drop table foo;
create table foo(id date primary key);
insert into foo select sysdate-level from dual connect by level<31;
select low_value, high_value from dba_tab_columns where table_name='FOO';
/*
LOW_VALUE HIGH_VALUE
-------------------------------------------- ------------------------------------------
*/
execute dbms_stats.gather_table_stats('JDOUGLAS', 'FOO');
select low_value, high_value from dba_tab_columns where table_name='FOO';
/*
LOW_VALUE HIGH_VALUE
-------------------------------------------- ------------------------------------------
786F0C0A0E0837 787001080E0837
*/