viernes, 5 de febrero de 2010

Colorear una sentencia sql (Colored SQL)

Muchos se preguntaran que significa "colorear un sentencia sql", verdad?. Lo que implica colorear es ni mas ni menos que marcar una sentencia identificandola por su sqlid, que es la identificación unica de una sentencia en la base da datos, para que los snapshots de AWR la incluyan en el repositorio y luego ser analizada. El repositorio de AWR almacena, entre otras cosas, las sentencias TOP, es decir las que mas consumieron entre dos snapshots, por default los snapshots se sacan cada hora, por lo que permite analizar por periodos de una hora. Si yo quisiera ver como se fue comportando una sentencia a lo largo de cierto tiempo pero dicha sentencia no esta dentro de las mas consumidoras no quedará registro y por lo tanto no se podrá analizar su actividad a posteriori. Para asegurar que se le siga el rastro a las ejecuciones de un sentencia, sin importar cuanto consume, a partir de 11g se la puede "colorear", veamos como es esto:

Armo una consulta bien sencilla, que obviamente no consumirá mucho y no quedará registrada en una base con una minima actividad:

rop@DESA11G> select 'TEST COLORED SQL' from dual;

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

Buscamos el sqlid asociado:

rop@DESA11G> set line 120
rop@DESA11G> select sql_text,sql_id from v$sqlstats where sql_text like '%TEST COLORED SQL%';

SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
SQL_ID
-------------
select sql_text,sql_id from v$sqlstats where sql_text like '%TEST COLORED SQL%'
f2c39t3uct6vp

select 'TEST COLORED SQL' from dual
0fm46pj2s9vux


Una vez obtenido el sqlid voy a marcarla o colorearla de la siguiente forma:

rop@DESA11G> ed
Escrito file afiedt.buf

1 begin
2 dbms_workload_repository.add_colored_sql(sql_id => '0fm46pj2s9vux'
3 );
4* end;
rop@DESA11G> /

Procedimiento PL/SQL terminado correctamente.

Ahora tomo un snapshot y luego ejecuto 3 veces la sentencia coloreada:

rop@DESA11G> begin
2 dbms_workload_repository.create_snapshot;
3 end;
4 /

Procedimiento PL/SQL terminado correctamente.

rop@DESA11G> select 'TEST COLORED SQL' from dual;

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

rop@DESA11G> /

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

rop@DESA11G> /

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

Tomo otro snapshot luego de aproximadamente 15' y veo si aparece:

rop@DESA11G> begin
2 dbms_workload_repository.create_snapshot;
3 end;
4 /

Procedimiento PL/SQL terminado correctamente.

rop@DESA11G> select executions_delta,cpu_time_delta,elapsed_time_delta from dba_hist_sqlstat
2 where snap_id = (select max(snap_id) from dba_hist_sqlstat)
3 and sql_id = '0fm46pj2s9vux';

EXECUTIONS_DELTA CPU_TIME_DELTA ELAPSED_TIME_DELTA
---------------- -------------- ------------------
3 0 0

La sentencia apareció y se ve que consumió tan poco que no se llegó a registrar tiempo
Para desmarcarla hago lo siguiente:

rop@DESA11G> ed
Escrito file afiedt.buf

1 begin
2 dbms_workload_repository.remove_colored_sql(sql_id => '0fm46pj2s9vux');
3* end;
rop@DESA11G> /

Procedimiento PL/SQL terminado correctamente.

Repito el proceso pero sin la consulta "coloreada":

rop@DESA11G> ed
Escrito file afiedt.buf

1 begin
2 dbms_workload_repository.create_snapshot;
3* end;
rop@DESA11G> /

Procedimiento PL/SQL terminado correctamente.

rop@DESA11G> select 'TEST COLORED SQL' from dual;

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

rop@DESA11G> /

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

rop@DESA11G> /

'TESTCOLOREDSQL'
----------------
TEST COLORED SQL

rop@DESA11G> begin
2 dbms_workload_repository.create_snapshot;
3 end;
4 /

Procedimiento PL/SQL terminado correctamente.

rop@DESA11G> ed
Escrito file afiedt.buf

1 select executions_delta,cpu_time_delta,elapsed_time_delta from dba_hist_sqlstat
2 where snap_id = (select max(snap_id) from dba_hist_sqlstat)
3* and sql_id = '0fm46pj2s9vux'
rop@DESA11G> /

ninguna fila seleccionada

rop@DESA11G>

Como se observa ahora no se registró en AWR, ya que como se vió es una sentencia con consumo nulo y que obviamente no califica entre las Top para ser persistida en el repositorio.

No hay comentarios:

Publicar un comentario