2012-06-11 9 views
6

Ho una dichiarazione che viene eseguita sul server di database Oracle. La dichiarazione ha circa 5 join e non c'è nulla di insolito lì. Sembra molto simile di seguito:Utilizzo di hint Oracle "FIRST_ROWS" per migliorare le prestazioni del database Oracle

SELECT field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

Il problema (e ciò che è interessante) è che la dichiarazione per l'utente id = 1 prende 1 secondo per ritornare 590 record. L'istruzione per userid = 2 impiega circa 30 secondi per restituire 70 record.

Non capisco perché la differenza è così grande.

Sembra che diverso piano di esecuzione viene scelto per la dichiarazione con userid = 1 e diverso per l'utente id = 2.

Dopo ho implementato Oracle Suggerimento FIRST_ROW, le prestazioni diventano significativamente migliore. Entrambe le istruzioni (per entrambi gli ID 1 e 2) producono un ritorno in meno di 1 secondo.

SELECT /*+ FIRST_ROWS */ 
     field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

Domande:
1) Quali sono le possibili cause di cattive prestazioni quando userid = 2 (quando suggerimento non è utilizzato)?
2) Perché il piano di esecuzione dovrebbe essere diverso per uno contro un'altra istruzione (quando non viene usato il suggerimento)?
3) C'è qualcosa su cui dovrei stare attento quando decido di aggiungere questo suggerimento alle mie domande?

Grazie

+2

Le statistiche del tuo tavolo sono aggiornate e precise? – Tebbe

+0

fare attenzione alla memorizzazione nella cache durante l'esecuzione di confronti delle prestazioni. – tbone

+0

Tebbe - Le statistiche sono aggiornate. Sono precisi, non lo so. – bobetko

risposta

8

1) Quali sono le possibili cause di cattive prestazioni quando userid = 2 (quando suggerimento non è utilizzato)?

Poiché Oracle ritiene che uno dei risultati intermedi imposta utilizzando il piano da (userid = 1) sarà molto grande, probabilmente errato.

2) Perché il piano di esecuzione dovrebbe essere diverso per uno contro un'altra istruzione (quando non viene utilizzato il suggerimento)? indici basati

Istogramma

3) C'è qualcosa che dovrei essere attenti a quando si decide di aggiungere questo suggerimento alle mie domande?

Fino a quando il numero di record da restituire è piccolo, questo suggerimento dovrebbe essere failry sicuro - a differenza spingendo l'ottimizzatore di utilizzare un indice specifico, questo approccio consente a Oracle di scegliere un piano diverso se gli indici sono cambiati.

+0

Grazie per la tua rapida risposta. La cosa più sconcertante è che non abbiamo avuto questo problema per 6 anni fino a 1 mese fa (quando abbiamo aggiornato alla nuova versione di Oracle). Da allora le prestazioni hanno iniziato a peggiorare (per alcuni utenti). Ci sono azioni che potrebbero essere eseguite sul server Oracle per ottimizzare le prestazioni? Grazie. – bobetko

+0

Mantenete aggiornate le vostre statistiche?Sarebbe bello analizzare se hai bisogno di istogrammi o meno – Sebas

+0

Stai usando variabili vincolate e passati a un DBMS con bind-peeking abilitato? – symcbean

Problemi correlati