2009-09-23 12 views
9

Qual è la differenza tra i predicati di accesso e filtro nel piano di esecuzione Oracle? Se ho capito bene, "access" è usato per determinare quali blocchi di dati devono essere letti, e "filter" viene applicato dopo che i blocchi sono stati letti. Quindi, il filtraggio è "malvagio".predicati di accesso e filtro nel piano di esecuzione Oracle

Nell'esempio della sezione predicato informazioni del piano di esecuzione di seguito:

10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y') 
    filter("CURRENT_VERSION_IND"='Y') 

perché "CURRENT_VERSION_IND" si ripete in entrambe le sezioni Accesso e filtro?

L'operazione corrispondente è la scansione INDEX RANGE sull'indice, che è definita sui campi (DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY).

La mia ipotesi è che poiché CURRENT_VERSION_IND non è la seconda colonna dell'indice, Oracle non può utilizzarlo durante la fase di accesso. Quindi, accede all'indice dalla colonna DOMAIN_CODE, recupera tutti i blocchi e quindi li filtra in base a CURRENT_VERSION_IND. Ho ragione?

risposta

6

No, i predicati di accesso in questo esempio indicano che l'indice viene attraversato da entrambi DOMAIN_CODE e CURRENT_VERSION_IND.

Non mi preoccuperei del predicato del filtro che sembra essere ridondante - sembra essere un capriccio del piano di spiegazioni, probabilmente qualcosa a che fare con il fatto che deve fare una sorta di skip-scan sull'indice (esegue una scansione dell'intervallo sulla prima colonna, quindi una scansione di salto su CODE_VALUE, alla ricerca di qualsiasi CURRENT_VERSION_IND s corrispondente).

Se è necessario modificare l'indice o creare un altro indice è un'altra questione interamente.

Inoltre, solo per correggere un piccolo malinteso: i blocchi devono essere recuperati dall'indice PRIMA di poter fare qualsiasi cosa, sia che si eseguano i passaggi "accesso" o "filtro". Se ti stai riferendo al recupero dei blocchi dalla tabella, allora anche la risposta è no - hai detto che il predicato del filtro "10" era sull'accesso dell'indice, non su un accesso alla tabella; e comunque, non c'è ragione per cui Oracle non possa valutare il filtro su CURRENT_VERSION_IND sull'indice - non ha bisogno di accedere alla tabella, a meno che non abbia bisogno di altre colonne non incluse nell'indice.

+0

Se un indice è definito su 1a, 2a e 3a colonna in una tabella, Oracle 10 sarà in grado di utilizzare l'indice se i predicati nella clausola WHERE sono sulla prima e terza colonna? Il 2 ° e il 3 °? Pensavo che la risposta fosse no. Inoltre, qual è in realtà la differenza tra i predicati di Accesso e Filtro? –

+2

Dalla versione 9i in poi (da quando hanno introdotto il metodo di accesso all'indice Skip Scan) Oracle può usare l'indice per accedere a colonne 1, 2, 3 o qualsiasi combinazione di esse. –

+1

I predicati di "accesso" sono quelli utilizzati per eseguire la scansione dell'indice: questi predicati vengono utilizzati per selezionare i blocchi di ramo e foglia da recuperare dall'indice e sono più importanti per le prestazioni della query. I predicati "Filtro" sono quelli applicati alle righe restituite dall'indice; determinano quali righe vengono infine inviate al passaggio successivo nel piano di esecuzione della query. Vedere la documentazione per ACCESS_PREDICATES e FILTER_PREDICATES della tabella del piano: http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/ex_plan.htm#PFGRF94708 –

2

Credo che tu abbia ragione nella tua valutazione di ciò che Oracle sta facendo, ma sbagliato dire che il passo del filtro (o qualsiasi altra scelta di ottimizzatore) è sempre "malvagio". Non ha senso indicizzare assolutamente tutte le possibili combinazioni di colonne su cui è possibile interrogare, quindi è spesso richiesto il filtraggio.

Tuttavia, se in questo caso aggiungendo CURRENT_VERSION_IND come seconda colonna dell'indice migliora le prestazioni significativamente sulla frequentemente eseguire query e non danneggia le prestazioni di altre query, allora può avere senso di farlo.

Problemi correlati