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
Le statistiche del tuo tavolo sono aggiornate e precise? – Tebbe
fare attenzione alla memorizzazione nella cache durante l'esecuzione di confronti delle prestazioni. – tbone
Tebbe - Le statistiche sono aggiornate. Sono precisi, non lo so. – bobetko