No, questo può essere errato.
Se si dispone di una tabella di grandi dimensioni, Oracle
può preferire derivare i campi dagli indici anziché dalla tabella, anche non esiste un singolo indice che copra tutti i valori.
Nell'ultimo articolo nel mio blog:
, v'è una query in cui Oracle
non usa scansione completa della tabella, ma piuttosto unisce due indici per ottenere i valori della colonna:
SELECT l.id, l.value
FROM t_left l
WHERE NOT EXISTS
(
SELECT value
FROM t_right r
WHERE r.value = l.value
)
Il piano è:
SELECT STATEMENT
HASH JOIN ANTI
VIEW , 20090917_anti.index$_join$_001
HASH JOIN
INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID
INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE
INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE
Come si può vedere, non c'è TABLE SCAN
su t_left
qui.
Invece, Oracle
prende gli indici id
e value
, li unisce in rowid
e ottiene il (id, value)
coppie dal risultato unirsi.
Ora, alla tua richiesta:
SELECT *
FROM some_table
WHERE field_one is not null and field_two = ?
GROUP BY
field_three, field_four, field_five
In primo luogo, esso non compilare, dal momento che si sta selezionando *
da una tabella con una clausola GROUP BY
.
È necessario sostituire *
con espressioni basate sulle colonne di raggruppamento e sugli aggregati delle colonne non raggruppanti.
.probabilmente beneficiare il seguente indice:
CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)
, dal momento che conterrà tutto ciò sia per il filtraggio su field_two
, l'ordinamento su field_three, field_four, field_five
(utile per GROUP BY
) e fare in modo che field_one
è NOT NULL
.
+1 per aver menzionato l'ottimizzatore, è probabilmente la causa più probabile di questo. –
Grazie per la risposta. Non avevo realizzato che il piano di spiegazione dipendesse dalla quantità di dati nella tabella. Non ci sono attualmente dati nella tabella, il che spiega perché l'ottimizzatore potrebbe aver saltato gli altri indici. In un'altra nota, sarebbe ancora utilizzato un indice composito su solo field_three e field_four senza field_five in query come quella sopra? Questo non includerebbe tutti i campi nella clausola group by. – onejigtwojig
@Mark - questo lo spiega. Vedi le mie modifiche per maggiori informazioni su quali indici Oracle potrebbe utilizzare per il gruppo. –