Bind Variables e V$SQL_BIND_CAPTURE

Sono rientrato lunedì da due settimane di “vacanze” ma ancora non posso dire di essere in forma, chissà perché ma 7/8 ore di sonno al giorno per me non sono sufficenti 😦

Ultimamente forse anche a causa della stanchezza, non ho molti spunti per scrivere nuovi post, ieri però ne ho trovato uno grazie ad un thread di discussione su oracleportal. Siccome avevo analizzato la vista V$SQL_BIND_CAPTURE tempo fa (ne avevo anche parlato in un mio post di un anno e mezzo fa) e ieri non mi ricordavo bene come funzionava e che informazioni mostra,  approfitto per un post riassuntivo.

La vista V$SQL_BIND_CAPTURE è stata introdotta con la versione 10g di Oracle e serve a visualizzare i valori delle bind variables utilizzati nell’esecuzione delle query sul database, ma con certe limitazioni, spiegate sulla documentazione. La prima è che vengono “catturare” solo le bind variables presenti nelle clausole WHERE o HAVING degli statement SQL, quindi quelle negli INSERT e negli UPDATE non sono mai catturate e visualizzate da nessuna parte. La seconda limitazione, sempre documentata, ma in modo più nascosto, è che le bind variables per uno stesso cursore vengono catturate al massimo ogni 15 minuti, per non sovraccaricare il sistema; questo è spiegato nella descrizione del campo LAST_CAPTURED.  Più precisamente il popolamento di questa vista è controllato da due parametri “nascosti” e non documentati:

  • _CURSOR_BIND_CAPTURE_INTERVAL che definisce in secondi l’intervallo minimo fra due “campionamenti” delle bind variables per due cursori; il suo valore di default è 900, pari proprio a 15 minuti
  • _CURSOR_BIND_CAPTURE_AREA_SIZE che definisce la dimensione massima dell’area di memoria occupata dalla vista, e quindi il numero massimo di record.

Una discussione su V$SQL_BIND_CAPTURE e la “cugina” V$SQL_BIND_METADATA si può trovare in un post del blog di Miladin Modrakovic che approfitto per segnalare.

Al riguardo scrisse un post anche Jonathan Lewis il quale rivelava di aver confuso il contenuto di quella vista con i valori utilizzati dall’ottimizzatore per la generazione dei piani (bind peeking). Risulta invece che il contenuto di V$SQL_BIND_CAPTURE è la versione formatatta ed estesa del contenuto del campo BIND_DATA della vista V$SQL, il quale ho verificato con due prove cambia insieme al contenuto di V$SQL_BIND_CAPTURE (non ho fatto un’analisi precisa ma vado in fiducia).

Per completezza dell’informazione, come precisato benissimo da Dion Cho in un commento dello stesso post di Lewis, le peeked binds vengono salvate da oracle nel campo v$sql_plan.other_xml, solitamente nella prima riga del piano di esecuzione.

La vista V$SQL_BIND_CAPTURE è una vista “istantanea”, nel senso che ad ogni suo aggiornamento il contenuto precedente va perso, però AWR ,per default ogni ora, salva una foto della vista nella tabella DBA_HIST_SQLBIND e quindi chi ha acquistato il Diagnostic Pack può interrogare questa tabella per fare qualche analisi, non indagini precise a causa appunto delle limitazioni del campionamento ogni 15 minuti effettuato per la V$SQL_BIND_CAPTURE E e di ogni ora per la DBA_HIST_SQLBIND.

Un pensiero su “Bind Variables e V$SQL_BIND_CAPTURE

Lascia un commento