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)

¿Fue útil?

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
*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top