Domanda

Abbiamo una relativamente classico scenario in cui la clausola data della domanda generata dalla applicazione utilizza un "maggiore di" per una determinata data.

Poiché non v'è alcuna clausola fine alla intervallo di date, Oracle non sceglie di utilizzare l'indice data e finisce per fare una scansione di tabella molto costoso, invece. Tuttavia sappiamo che questi dati è temporale, quindi sappiamo non ci sono dati in futuro. Quindi, se modifichiamo lo SQL per includere una data di fine del sysdate per il periodo di tempo, poi la query utilizza l'indice e diventa molto a buon mercato.

Purtroppo, a causa di un errore nell'applicazione che usiamo siamo in grado di modificare l'applicazione. Quindi non v'è alcun modo in Oracle che possibile "insegnare" oracolo che i dati max in quella tabella è oggi, in modo che possa prendere una decisione intelligente, o è l'unico vero modo per risolvere questo problema a livello di database al pin del piano?

Rgds, Dan

(Oracle Solaris 10 Sparc)

È stato utile?

Soluzione

Oracle deve essere in grado di utilizzare le statistiche per determinare i valori alti e bassi per ogni colonna se li stanno mantenendo aggiornate:

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
*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top