[ 2017-10-23 ]

Cómo utilizar SQLHC para análizar un SQL - Ejemplo práctico


En el post anterior: "Que es SQL Tuning Health-Check (SQLHC)?" hablamos sobre la herramienta SQLHC para analizar y mejorar consultas SQL.       
Ahora vamos a ver un ejemplo de como utilizar esta herramienta sobre una consulta real, y como ver e interpretar los resultados obtenidos.
Para nuestro ejemplo vamos a utilizar una base de datos 12cR1 en la cual creamos un esquema “demo” y una tabla “T1”
A continuación las sentencias utilizadas para la creación de la tabla que utilizaremos en la consulta de nuestro ejemplo:

[oracle@server01 dbs]$ sqlplus demo/demo

SQL> create table t1 ( c1 int, c2 int, c3 char(10) );
Table created.

SQL> begin
     for i in 1 .. 100000
       loop
         insert into t1 values ( i, dbms_random.value(1,500), dbms_random.string('L', 10) );
         end loop;
         commit;
     end;
    /

PL/SQL procedure successfully completed.

SQL> select * from t1;

        C1         C2 C3
---------- ---------- ----------
       920        347 sfytxqttlk
       921        324 nosmokbtjm
       922        323 wuhlgndgid
       923        395 ssdzzfkoyk
       924        401 irwfhqcezg
       925        248 aqehbwbxgc
       926        184 qnrsyzaeev
       927        164 tapbircmud
       928        213 xzevacqrhb
       929        168 ajveiugahz
       930        249 prnyejwara
       931        181 vjrvprhfmv
       932        351 oexvprklht
       933         53 lyifwdhsrw
       934        358 relwqatwao
       935        340 nncqoueutl
       936        155 epoyxjzcfn
       937        443 aanwinkzzg
       938        312 opxzaybeza
       939        148 gdifpdyjxo
       940        357 ajlezudbjz
       941        449 bpoxynydmu
       942         16 igczhxinsh
       943          3 ztxuezldwc
       944        437 ubgtnglexw
       945        488 djtcihvikz
       946        332 zjswjrufjp
       947         38 oaqftbgjrl
       948        184 twfczivdnc
       949        118 nyqlimvtzl
       950        498 upmeornuts
       951        262 flsfevihpd
       952          3 flyroufvrg

>>> continúa la salida <<<

Tomamos estadísticas:

SQL> EXEC DBMS_STATS.gather_table_stats('DEMO', 'T1', estimate_percent => 15, cascade => TRUE);SQL>

PL/SQL procedure successfully completed.

Ahora vamos a realizar el análisis de una consulta sobre la tabla T1.
Lo primero que debemos hacer (si es que todavía no lo hicimos) es descargar la herramienta:


Una vez descargada copiarla en el servidor de base de datos:
Creamos un directorio (ej. tuning_sql) en el home del usuario Oracle(la ubicación es a gusto) y copiamos allí el .zip.

[oracle@server01 ~]$ mkdir tuning_sql
[oracle@server01 ~]$ mv sqlhc.zip tuning_sql/
[oracle@server01 ~]$ cd tuning_sql/

[oracle@server01 tuning_sql]$ ls -rlt
total 84
-rw-r--r--. 1 oracle oinstall 82313 Oct 13 11:12 sqlhc.zip

Una vez copiada, descomprimimos el archivo .zip. Esto nos dejará en el directorio tres archivos .sql:

[oracle@server01 tuning_sql]$ unzip sqlhc.zip
Archive:  sqlhc.zip
   creating: sqlhc/
  inflating: sqlhc/sqlhc.sql
  inflating: sqlhc/sqldx.sql
  inflating: sqlhc/sqlhcxec.sql

Ahora si, ya está preparado todo para correrlo cuando lo necesitemos.

Primero vamos a generar nuestra consulta SQL.
Nos conectamos con el usuario “demo” y ejecutamos una consulta sobre la table T1 que ya tenemos creada.

[oracle@server01 tuning_sql]$ sqlplus demo/demo

SQL> select * from t1 where c3 like '%aaj%' order by 3;

        C1         C2 C3
---------- ---------- ----------
     35452        356 aajcyapzzj
     44750        148 aajflteeop
     18020        224 aajgirqdow
     84960         42 aajksxwmin
     26318        185 aajlrodaot
     37768         55 aajqjpayjs
     46441        214 aajumklgcb
     13104        320 aajvkoymgn
     97910        177 aajwsbisop
     87098        294 aajydnwqzv
     43202        450 akhbloaajm

>>> continúa <<<

Generamos un explain plan para la consulta (sólo a modo informativo):

SQL> explain plan for select * from t1 where c3 like '%aaj%' order by 3;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2148421099

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |  5014 |    97K|   103   (1)| 00:00:01 |
|   1 |  SORT ORDER BY     |      |  5014 |    97K|   103   (1)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| T1   |  5014 |    97K|   103   (1)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------

   2 - filter("C3" LIKE '%aaj%' AND "C3" IS NOT NULL)

14 rows selected.

Ahora vamos a ejecutar el script sqlhc.sql que genera el reporte.
Nos conectamos con system (acceso a vistas del diccionario) y obtenemos el SQL_ID de la consulta. Este será requerido como parámetro por el script.

SQL> SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text
      FROM  v$sql
      WHERE sql_text like '%aaj%';


[oracle@server01 sqlhc]$ sqlplus system

SQL_ID        PLAN_HASH_VALUE SQL_TEXT
------------- --------------- ----------------------------------------------------------------------------------------------------
2zqhzuavpp8st      2148421099 select * from t1 where c3 like '%aaj%' o

Forzamos también un snapshot de AWR para bajar los datos de memoria al repositorio:

SQL> exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed.

Ubicados en el directorio donde descomprimimos la herramienta, ejecutamos el script:

SQL> host pwd
/home/oracle/tuning_sql/sqlhc

SQL> host ls -lrt
total 620
-rw-r--r--. 1 oracle oinstall  48747 Nov 11  2013 sqldx.sql
-rw-r--r--. 1 oracle oinstall 288298 Apr 16  2014 sqlhc.sql
-rw-r--r--. 1 oracle oinstall 292838 Apr 16  2014 sqlhcxec.sql

SQL> @sqlhc.sql T 2zqhzuavpp8st     

(pasamos como parámetro:
T:             Indicando que utilizaremos Tuning Pack y Diagnostic Pack
SQL_ID: Pasamos el SQL_ID obtenido previamente y correspondiente a la consulta a analizar. )
...
<ejecución del script>
...

Una vez terminada la ejecución (veremos una salida bastante importante) se habrá generado un archivo .zip con la información obtenida.

SQL>host ls -lrt
total 1800
-rw-r--r--. 1 oracle oinstall  48747 Nov 11  2013 sqldx.sql
-rw-r--r--. 1 oracle oinstall 288298 Apr 16  2014 sqlhc.sql
-rw-r--r--. 1 oracle oinstall 292838 Apr 16  2014 sqlhcxec.sql
-rw-r--r--. 1 oracle oinstall 634708 Oct 13 13:42 sqlhc_20171013_133701_2zqhzuavpp8st.zip

Ahora bien, para examinar la información generada, en nuestro caso copiamos desde el servidor el archivo y lo descomprimimos:
Adentro del .zip tenemos el siguiente contenido:



4 archivos con información en formato html
1 archivo de trace .trc
2 archivos comprimidos .zip


Los archivos .zip contienen información complementaria como ser logs y contenido de vistas/tablas del diccionario en formato .xls
Lo mas importante aqui para nosostros y nuestro análisis son los html.

El primero, 1_health_check:
Contiene información general, sobre el SQL y objetos relacionados.
Lo más importante son las observaciones, donde encontramos issues a tener en cuenta sobre el ambiente donde se ejecutó la consulta. Es conveniente analizarlos con cuidado, si es necesario tomar acciones. Luego volver a generar el reporte.






El segundo archivo html, 2_diagnostics:
Incluye bastante información para profundizar en el diagnóstico para evaluar el comportamiento durante la ejecución de la consulta. Mucha información es extraida de AWR si la licencia asi lo permite.




 El tercer archivo, 3_execution_plans
Contiene información del plan de ejecución en la útlima ejecució y anteriores, asi como un histórico para poder realizar comparaciones y poder detectar cambios y/o degradación.



El cuarto y último archivo 4_sql_deatils podemos ver un "Enterprise Manager - Database Active Report" de la consulta en cuestión.


No hay comentarios:

Publicar un comentario