Cost Based Optimizer e Bind Variable Peeking: Oracle 11g

martedì 11 dicembre 2007 alle 11:55 | Pubblicato su Performance Tuning | Lascia un commento

Recentemente è stato inaugurato un nuovo blog su Oracle: optimizermagic.blogspot.com sponsorizzato per primo da Joel Gary sul CDOS e pochi giorni fa anche da Thomas Kyte. Infine un link all’ultimo post compare anche sulla pagina di OTN. Tale pubblicità lo renderà popolare, soprattuto se il livello dei post sarà pari a quello dell’ultimo.
Il tema è interessante e l’esposizione mi pare ottima. La mia esperienza mi dice che l’accoppiata CBO-Bind Variables può dare spiacevoli sorprese. La cosa è abbastanza normale, soprattutto in casi particolari in cui una stessa query può essere eseguita sia con valori selettivi che valori poco selettivi.  Sul tema mi sono confrontato anche recentemente con un consulente Oracle al quale ho descritto la mia esperienza di malfunzionamenti (di cui ho gia scritto qui). Il consulente, forte delle statistiche e dell’esperienza, poneva l’accento sul progetto dell’applicazione. Ciò che però fa Oracle, e lo dimostra quest’ultima caratteristica introdotta nella versione 11g, è venire incontro a questi problemi. Questo secondo me è il segno che la risposta “rivedere l’applicazione” non è in assoluto la migliore, anche Oracle può fare qualcosa e lo fa.

Alla fine la nostra sfortunata vicenda si è risolta come da manuale: è stata modicata l’applicazione. In realtà la cosa mi ha seccato perchè inizialmente non sembrava possibile far nulla, poi si è trovato la scappatoia (nel frattempo sono stati buttati via soldi in costose consulenze Oracle). In ogni caso la struttura anomala della base dati non è cambiata, quindi il problema potrebbe ripresentarsi. E’ ovvio che le statistiche diano ragione ad Oracle, nel nostro caso Oracle non dava nessuna soluzione, l’unica alternativa era modificare l’applicazione e quindi era una soluzione forzata che rientrerà nelle statistiche con cui Oracle (e chiunque faccia consulenza su “performance tuning”) può dire: l’80% dei problemi di performance deriva da una sbagliata progettazione dell’applicazione.

Un punto di discussione su cui mi sono confrontato con il consulente Oracle è stato l’uso di valori espliciti al posto di bind variables in casi particolari come soluzione a comportamenti anomali del CBO, quali quelli forse risolti dalla nuova caratteristica descritta in optimizermagic.blogspot.com. Si tratta di una soluzione che in una situazione disperata abbiamo provato e si è dimostrata funzionante, senza mettere in ginocchio il sistema costretto a fare qualche “hard parse” in più. In quest’occasione secondo me il consulente si è mostrato eccessivamente rigido, opponendo come soluzione l’uso di Hint, cosa secondo me sbagliata, basta leggere attentemente il caso di esempio usato nel post “Why are there more cursors …“. Se si mette l’hint per forzare l’uso dell’indice, nel caso del valore “10” tale hint risulterà sbagliato. Molto buona invece pare la soluzione trovata da Oracle (se funziona bene come descritto).

La verità secondo me è che l’uso di hint aiuta ad avere un comportamento più prevedibile, simile quello dell’ottimizzatore RULE, che, sempre per tornare al caso d’esempio, si sarebbe comportato usando sempre l’indice. Quindi ora il CBO può diventere realmente e nettamente superiore al RULE.

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: