Come posso scegliere diversi suggerimenti per i diversi unisce per una singola tabella in un hint per la query?

StackOverflow https://stackoverflow.com/questions/2524248

Domanda

Supponiamo che io ho la seguente query:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Ho indici su A.x e B.x e B.y e C.y e D.z

Non c'è indice su A.z.

Come posso dare un suggerimento a questa query per utilizzare un hint di indice su A.x ma un accenno USE_HASH su A.z? Sembra che i suggerimenti solo prendere il nome della tabella, non si uniscono alla specifica, in modo da quando si utilizza una singola tabella con più join posso specificare solo una strategia unica per tutti loro.

alternativa, supponiamo che io sto usando un primario o suggerimento ORDINATO sulla query di cui sopra. Entrambi questi suggerimenti solo prendono un nome di tabella e, quindi come posso garantire che l'A.x = B.x unirsi avviene prima di quella A.z = D.z? Mi rendo conto che in questo caso potrei elencare D prima, ma immaginate D si unisce in seguito a E e che il D-E join è l'ultimo quello che voglio in tutta la query.

Una terza configurazione - Supponiamo che io voglio l'A.x si uniscono per essere il primo di tutta la domanda, e voglio che l'A.z si uniscono per essere l'ultimo. Come posso usare un suggerimento per avere un singolo partecipare da un avvenire, seguito dal B-C unirsi, e la A-D unirsi a durare?

È stato utile?

Soluzione

Prima di tutto, l'utilizzo di tali suggerimenti dovrebbe essere l'ultima risorsa, non un modo normale di scrittura delle interrogazioni. Il più delle volte si deve solo assicurarsi che ottimizzatore statistiche sono aggiornate e lasciare che il CBO lavorare fuori il percorso ottimale per se stesso - questo è il suo lavoro

Il suggerimento INDEX può specificare il nome dell'indice che si desidera utilizzare in questo modo:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(supponendo che l'indice A.X è chiamato A_X_IDX).

Non si può dire l'uso di Oracle utilizza l'indice sulla A.X e utilizzare un hash join alla tabella A nella stessa istruzione, che non ha senso. Tuttavia, è possibile (se è necessario) specificare il percorso di accesso per ogni tabella qualcosa come:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

Ma per ribadire, dovrebbe essere rare per bisogno di fare questo. Oracle ha investito milioni di dollari e di ore uomo in via di sviluppo il CBO, quindi perché efficacemente spegnerlo?

Altri suggerimenti

In SQL Server, si farebbe un hash suggerimento giunto come questo

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

e si può anche fornire un hint di indice

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

Non so che cosa la sintassi si presenta come in Oracle, BTW perché stai usando vecchio stile si unisce? Sei ancora in 8i?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top