La clausola SAMPLE e tipi di LOCK per la SELECT FOR UPDATE

martedì 23 ottobre 2007 alle 23:09 | Pubblicato su Performance Tuning | Lascia un commento

Oggi ho incontrato casualmente la clausa SAMPLE in una query, l’ho notata qui cercando informazioni sul tipo di lock su tabella che Oracle acquisisce con la “SELECT … FOR UPDATE”. Questa clausola pensandoci bene mi sembra di averla gia vista usata in qualche libro, però me n’ero completamente scordato ed è un peccato. Effettivamente non si tratta di una caratteristica utile tutti i giorni, ma in alcuni particolari test secondo me può risultare utile. Essa in sostanza, appesa ad una SELECT, permette di specificare una percentuale campione di record o blocchi da prelevare sul totale che la select selezionerebbe. Quindi, se per fare dei test si vuole prelevare un campione casuale di record questa clausola è la soluzione giusta.

Dicevo che ho incontrato questo cosa (che risulta già presente in Oracle 9iR2, non so le versioni precedenti) cercando informazioni sul tipo di Lock che oracle acquisice automaticamente quanto una sessione esegue una ”SELECT … FOR UPDATE”. Stando al manuale “Concepts” il lock dovrebbe essere “ROW SHARE” corrispondente al valore “2” per la colonna LMODE della vista V$LOCK. In realtà dalle mie prove risulta che la “SELECT … FOR UPDATE” acquisisca sempre un lock (stiamo parlando di Table Lock) di tipo “ROW EXCLUSIVE”, corrispondente al valore “3” nella colonna LMODE della vista V$LOCK. Fra l’altro questa è la stessa modalità acquisita con le istruzioni “INSERT”, “UPDATE” e “DELETE”. Sul libro su cui sto studiando per la certificazione Oracle sull’argomento sono evasivi, evitando di dire cose che nei fatti possono essere smentite come accade con ciò che leggo sul manuale. Allora ho provato a fare una veloce ricerca su internet, ma al momento non ho trovato conferme o smentite.

P.S.

Anche questa volta Google si dimostra insuperabile, per quello che posso capire, qui si riporta lo stesso problema e viene riportata una nota metalink che spiega cosa è successo. Dalla 9.2.0.6, con una patch è stato modificato il comportamento della “SELECT … FOR UPDATE” che in particolari casi creava problemi. Ho verificato che in effetti su 9.2.0.1 il tipo di lock è ancora il 2. Peccato che Oracle si sia scordata di aggiornare la documentazione, tuttora, sulla documentazione della 11g si afferma che la “SELECT … FOR UPDATE” acquisiche un lock di tipo “ROW SHARE”. Speriamo che all’esame per la certificazione non mi capiti una domanda sull’argomento.

Il comportamento modificato introdotto dalla patch, come indicato nella nota metalink 4969880.8 può essere disabilitato a livello di sessione.

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...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: