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.
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
<ejecución del script>
...
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.
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.
No hay comentarios:
Publicar un comentario