Entra

View Full Version : [SQL] Problema indice locale Oracle


mirmanero
09-09-2009, 16:57
Ciao a tutti,
ho un problema che mi sta facendo impazzire:

ho una tabella "Tabella" partizionata per data e con un indice locale su un campo che chiamerò A. Se effettuo un semplice query del tipo

select * from Tabella
where data = '01-gen-09'
and A = 'a'

la risposta è molto veloce, dal momento che prima viene selezionata la partizione tramite la data poi vengono selezionati i dati che soddisfano la condizione sul campo A (come confermato dal piano di esecuzione).

Fin qui tutto bene, ma utilizzando una tabella "Calendario" che mi collega due date diverse (che chiamo data1 e data2), con data1 chiave primaria ed effettuando una query del tipo:

select Tabella.* from
Tabella,
Calendario
where Calendario.data1='01-gen-09'
and Tabella.data=Calendario.data2
and Tabella.A='a'

la query diventa lentissima, infatti il piano di esecuzione mi dice che prima accede a tutte le partizioni di Tabella tramite l'indice e solo dopo sceglie quale partizione utilizzare.

Ho provato a guardare le hint ma non ho trovato il modo per forzarlo a invertire le due operazioni.

Qualcuno ha qualche suggerimento???

Grazie!!

gugoXX
10-09-2009, 23:53
Prova con la seguente

select /*+ORDERED*/ Tabella.* from
Calendario,
Tabella
where Calendario.data1='01-gen-09'
and Tabella.data=Calendario.data2
and Tabella.A='a'

Comunque non va bene. Prova a ricomputare le statistiche sia delle tabelle che degli indici e lanciare la query senza hint
Eventualmente se del caso ricostruisci la tabella e quindi anche tutte le partizioni prima di ricomputare

mirmanero
17-09-2009, 09:45
Grazie della risposta, mi sono accorto che in realtà la situazione era leggermente diversa:

la select che ho scritto non veniva fatta direttamente dalla Tabella ma da una vista che faceva la union della Tabella con un'altra tabella molto più piccola che non è partizionata.
La select dalla Tabella (dopo aver fatto rigirare le statistiche) si è comportata correttamente, quella dalla vista no.

Alla fine ho risolto facendo separatamente le select sulle due tabelle per fare la union solo dopo.

Ovviamente rimane da capire il motivo per cui l'ottimizzatore di oracle si comporti così e se si riesca a forzare il piano come volevo io senza modificare la struttura sottostante, ma oramai è solo na curiosità accademica :-P