SQL Monitor: Como monitorar consultas rápidas?

sql monitor

A partir da versão 11g o Oracle Database disponibiliza um recurso fantástico chamado SQL Monitor que possibilita a visualização de uma infinidade de informações sobre a execução de uma instrução SQL, tanto para instruções encerradas como para instruções que ainda estão em execução, é possível acessar esse recurso de forma gráfica através do Oracle Cloud Control e SQLDeveloper ou em formato texto através da package DBMS_SQLTUNE.

Para não sobrecarregar o banco de dados, o SQL Monitor só captura informações de instruções que demoram mais 5 segundos ou que executam na modalidade paralela. Neste artigo vamos mostrar na prática como utilizar este recurso fantástico para analisar um consulta que demora menos de 5 segundos. No nosso exemplo prático vamos utilizar a package DBMS_SQLTUNE para visualizar as informações capturadas pelo SQL Monitor.

Pré-requisitos para utilizar SQL Monitor

1) Para utilizar o SQL Monitor é preciso que a base tenha a licença das “OPTIONS DIAGNOSTIC PACK AND TUNING PACK
2) O parâmetro STATISTICS_LEVEL deve estar configurado como TYPICAL ou ALL
3) O parâmetro CONTROL_MANAGEMENT_PACK_ACCESS deve estar configurado como DIAGNOSTIC+TUNING

Demostração prática

As próximas etapas desse artigo mostram como podemos forçar a captura de uma instrução SQL pelo SQL Monitor:

1) O SQL Monitor não captura instruções SQL com tempo inferior a 5 segundos

  1.1) Execução de uma consulta com tempo de execução inferior a 5 segundos
  1.2) Verificar se SQL Monitor capturou a consulta

2) Forçar o SQL Monitor capturar a instrução SQL

  2.1) Executar a mesma consulta com HINT MONITOR
  2.2) Verificar se SQL Monitor capturou a consulta
  2.3) Emitir o relatório do SQL Monitor

3) Forçar a captura do SQL Monitor sem alterar a instrução SQL

  3.1) Executar a mesma consulta
  3.2) Gerar uma SQL Profile para forçar a captura SQL Monitor
  3.3) Executar a consulta para captura pelo SQL Monitor
  3.4) Emitir o relatório do SQL Monitor

1) O SQL Monitor não captura instruções SQL com tempo inferior a 5 segundos

1.1) Execução de uma consulta com tempo de execução inferior a 5 segundos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
SQL > SELECT * FROM V$VERSION where rownum < 2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SQL >
SQL >
SQL > ALTER SESSION SET statistics_level=ALL;

Sessão alterada.

SQL >
SQL > ALTER SESSION SET current_schema = sh;

Sessão alterada.

SQL >
SQL >
SQL > SELECT /* dbtw001 */ count(1) Qtde
  2    FROM customers  c,
  3         sales      s
  4   WHERE c.cust_id = s.cust_id
  5     AND s.quantity_sold > 1;

      QTDE
----------
         4

SQL >
SQL >
SQL > column sql_id new_value m_sql_id
SQL > column child_number new_value m_child_no
SQL >
SQL > SELECT sql_id, child_number
  2    FROM v$sql
  3   WHERE sql_text LIKE '%dbtw001%'
  4     AND sql_text NOT LIKE '%v$sql%';

SQL_ID        CHILD_NUMBER
------------- ------------
dw5t15p94q2bz            0

SQL >
SQL >
SQL > SELECT *
  2    FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  dw5t15p94q2bz, child number 0
-------------------------------------
SELECT /* dbtw001 */ count(:"SYS_B_0") Qtde   FROM customers  c,
sales      s  WHERE c.cust_id = s.cust_id    AND s.quantity_sold >
:"SYS_B_1"

Plan hash value: 2841872969

---------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |      1 |        |      1 |00:00:01.29 |    4477 |   4439 |
|   1 |  SORT AGGREGATE       |              |      1 |      1 |      1 |00:00:01.29 |    4477 |   4439 |
|   2 |   NESTED LOOPS        |              |      1 |    166 |      4 |00:00:01.29 |    4477 |   4439 |
|   3 |    PARTITION RANGE ALL|              |      1 |    166 |      4 |00:00:01.29 |    4471 |   4439 |
|*  4 |     TABLE ACCESS FULL | SALES        |     28 |    166 |      4 |00:00:01.29 |    4471 |   4439 |
|*  5 |    INDEX UNIQUE SCAN  | CUSTOMERS_PK |      4 |      1 |      4 |00:00:00.01 |       6 |      0 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."QUANTITY_SOLD">:SYS_B_1)
   5 - access("C"."CUST_ID"="S"."CUST_ID")


25 linhas selecionadas.

SQL >

1.2) Verificar se SQL Monitor capturou a consulta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL > select sid,
  2         sql_id,
  3         sql_exec_id,
  4         to_char(sql_exec_start,'DD-Mon-YY HH24:MI:SS') sql_exec_start,
  5         sql_plan_hash_value plan_hash_value,
  6         elapsed_time/1000000 etime,
  7         buffer_gets,
  8         disk_reads
  9    from v$sql_monitor
 10   where sql_id = 'dw5t15p94q2bz';

não há linhas selecionadas

SQL >

Como podemos observar o SQL Monitor não registrou informações dessa consulta.

2) Forçar o SQL Monitor capturar a instrução SQL

2.1) Executar a mesma consulta com HINT MONITOR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
SQL > ALTER SESSION SET statistics_level=ALL;

Sessão alterada.

SQL >
SQL > ALTER SESSION SET current_schema = sh;

Sessão alterada.

SQL >
SQL >
SQL > SELECT /*+ MONITOR  */ /* dbtw002 */ count(1) Qtde
  2    FROM customers  c,
  3         sales      s
  4   WHERE c.cust_id = s.cust_id
  5     AND s.quantity_sold > 1;

      QTDE
----------
         4

SQL >
SQL >
SQL > column sql_id new_value m_sql_id
SQL > column child_number new_value m_child_no
SQL >
SQL > SELECT sql_id, child_number
  2    FROM v$sql
  3   WHERE sql_text LIKE '%dbtw002%'
  4     AND sql_text NOT LIKE '%v$sql%';

SQL_ID        CHILD_NUMBER
------------- ------------
5q107s0svt6rm            0

SQL >
SQL >
SQL > SELECT *
  2    FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5q107s0svt6rm, child number 0
-------------------------------------
SELECT /*+ MONITOR  */ /* dbtw002 */ count(:"SYS_B_0") Qtde   FROM
customers  c,        sales      s  WHERE c.cust_id = s.cust_id    AND
s.quantity_sold > :"SYS_B_1"

Plan hash value: 2841872969

---------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |      1 |        |      1 |00:00:01.46 |    4477 |   4439 |
|   1 |  SORT AGGREGATE       |              |      1 |      1 |      1 |00:00:01.46 |    4477 |   4439 |
|   2 |   NESTED LOOPS        |              |      1 |    166 |      4 |00:00:01.46 |    4477 |   4439 |
|   3 |    PARTITION RANGE ALL|              |      1 |    166 |      4 |00:00:01.46 |    4471 |   4439 |
|*  4 |     TABLE ACCESS FULL | SALES        |     28 |    166 |      4 |00:00:01.46 |    4471 |   4439 |
|*  5 |    INDEX UNIQUE SCAN  | CUSTOMERS_PK |      4 |      1 |      4 |00:00:00.01 |       6 |      0 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."QUANTITY_SOLD">:SYS_B_1)
   5 - access("C"."CUST_ID"="S"."CUST_ID")


25 linhas selecionadas.

SQL >

2.2) Verificar se SQL Monitor capturou a consulta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL > select sid,
  2         session_serial#,
 3         sql_id,
  4         sql_exec_id,
  5         to_char(sql_exec_start,'DD-Mon-YY HH24:MI:SS') sql_exec_start,
  6         sql_plan_hash_value plan_hash_value,
  7         elapsed_time/1000000 etime,
  8         buffer_gets,
  9         disk_reads
 10    from v$sql_monitor
 11   where sql_id = '5q107s0svt6rm';

       SID SESSION_SERIAL# SQL_ID        SQL_EXEC_ID SQL_EXEC_START       PLAN_HASH_VALUE      ETIME BUFFER_GETS DISK_READS
---------- --------------- ------------- ----------- -------------------- --------------- ---------- ----------- ----------
      1290            2327 5q107s0svt6rm    33554432 24-Abr-17 20:42:11        2841872969   1,467301        4479        155

SQL >

2.3) Emitir o relatório do SQL Monitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
SQL > set long 999999999
SQL > set lines 280
SQL > col report for a279
SQL > select DBMS_SQLTUNE.REPORT_SQL_MONITOR(session_id=> 1290, session_serial=> 2327, sql_id=> '5q107s0svt6rm', sql_exec_id=> '33554432', report_level=>'ALL') as report from dual;

REPORT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Monitoring Report

SQL Text
------------------------------
SELECT /*+ MONITOR */ /* dbtw002 */ count(:"SYS_B_0") Qtde FROM customers c, sales s WHERE c.cust_id = s.cust_id AND s.quantity_sold > :"SYS_B_1"

Global Information
------------------------------
 Status              :  DONE (ALL ROWS)
 Instance ID         :  2
 Session             :  VALTER (1290:2327)
 SQL ID              :  5q107s0svt6rm
 SQL Execution ID    :  33554432
 Execution Started   :  04/24/2017 20:42:11
 First Refresh Time  :  04/24/2017 20:42:11
 Last Refresh Time   :  04/24/2017 20:42:12
 Duration            :  1s
 Module/Action       :  SQL*Plus/-
 Service             :  ODBSRV01
 Program             :  sqlplus.exe
 Fetch Calls         :  1

Binds
========================================================================================================================
|   Name   | Position |  Type  |                                         Value                                         |
========================================================================================================================
| :SYS_B_1 |        2 | NUMBER | 1                                                                                     |
========================================================================================================================

Global Stats
=========================================================================================
| Elapsed |   Cpu   |    IO    | Application |  Other   | Fetch | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) | Calls |  Gets  | Reqs | Bytes |
=========================================================================================
|    1.47 |    0.04 |     1.40 |        0.01 |     0.02 |     1 |   4479 |  155 |  35MB |
=========================================================================================

SQL Plan Monitoring Details (Plan Hash Value=2841872969)
=========================================================================================================================================================
| Id |        Operation        |     Name     |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |   Activity Detail    |
|    |                         |              | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |     (# samples)      |
=========================================================================================================================================================
|  0 | SELECT STATEMENT        |              |         |      |         1 |     +1 |     1 |        1 |      |       |          |                      |
|  1 |   SORT AGGREGATE        |              |       1 |      |         1 |     +1 |     1 |        1 |      |       |          |                      |
|  2 |    NESTED LOOPS         |              |     166 | 1290 |         1 |     +1 |     1 |        4 |      |       |          |                      |
|  3 |     PARTITION RANGE ALL |              |     166 | 1290 |         1 |     +1 |     1 |        4 |      |       |          |                      |
|  4 |      TABLE ACCESS FULL  | SALES        |     166 | 1290 |         1 |     +1 |    28 |        4 |  155 |  35MB |   100.00 | direct path read (1) |
|  5 |     INDEX UNIQUE SCAN   | CUSTOMERS_PK |       1 |      |         1 |     +1 |     4 |        4 |      |       |          |                      |
=========================================================================================================================================================


SQL >

Com a utilização do hint MONITOR forçamos a captura das informações da consulta pelo SQL Monitor o que permite a emissão do relatório da consulta.

No ambiente de trabalho muitas vezes a reprodução de uma consulta e seu plano de execução é uma tarefa relativamente complexa e isso dificulta a utilização do HINT como recurso para forçar a captura da instrução pelo SQL Monitor, nesses casos podemos utilizar a solução a seguir.

3) Forçar a captura do SQL Monitor sem alterar a instrução SQL

3.1) Executar a mesma consulta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
SQL > ALTER SESSION SET statistics_level=ALL;

Sessão alterada.

SQL >
SQL > ALTER SESSION SET current_schema = sh;

Sessão alterada.

SQL >
SQL >
SQL > SELECT /* dbtw003 */ count(1) Qtde
  2    FROM customers  c,
  3         sales      s
  4   WHERE c.cust_id = s.cust_id
  5     AND s.quantity_sold > 1;

      QTDE
----------
         4

SQL >
SQL >
SQL > column sql_id new_value m_sql_id
SQL > column child_number new_value m_child_no
SQL >
SQL > SELECT sql_id, child_number
  2    FROM v$sql
  3   WHERE sql_text LIKE '%dbtw003%'
  4     AND sql_text NOT LIKE '%v$sql%';

SQL_ID        CHILD_NUMBER
------------- ------------
gb0h2ra62zg18            0

SQL >
SQL >
SQL > SELECT *
  2    FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  gb0h2ra62zg18, child number 0
-------------------------------------
SELECT /* dbtw003 */ count(:"SYS_B_0") Qtde   FROM customers  c,
sales      s  WHERE c.cust_id = s.cust_id    AND s.quantity_sold >
:"SYS_B_1"

Plan hash value: 2841872969

---------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |      1 |        |      1 |00:00:01.54 |    4477 |   4439 |
|   1 |  SORT AGGREGATE       |              |      1 |      1 |      1 |00:00:01.54 |    4477 |   4439 |
|   2 |   NESTED LOOPS        |              |      1 |    166 |      4 |00:00:01.54 |    4477 |   4439 |
|   3 |    PARTITION RANGE ALL|              |      1 |    166 |      4 |00:00:01.54 |    4471 |   4439 |
|*  4 |     TABLE ACCESS FULL | SALES        |     28 |    166 |      4 |00:00:01.54 |    4471 |   4439 |
|*  5 |    INDEX UNIQUE SCAN  | CUSTOMERS_PK |      4 |      1 |      4 |00:00:00.01 |       6 |      0 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."QUANTITY_SOLD">:SYS_B_1)
   5 - access("C"."CUST_ID"="S"."CUST_ID")


25 linhas selecionadas.

SQL >

3.2) Gerar uma SQL Profile para forçar a captura SQL Monitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SQL > set serveroutput on size 9999
SQL > declare
  2     v_profile_name varchar2(30);
  3     v_sql_text clob;
  4  begin
  5
  6     select sql_fulltext into v_sql_text
  7       from v$sqlarea
  8      where sql_id = 'gb0h2ra62zg18';
  9
 10     v_profile_name := 'SQLPROFILE_'||'gb0h2ra62zg18';
 11
 12     dbms_sqltune.import_sql_profile(
 13          sql_text => v_sql_text,
 14          profile =>  sqlprof_attr('monitor'),
 15          category => 'DEFAULT',
 16          name =>     v_profile_name);
 17
 18     dbms_output.put_line('-----------------------------------------------------------');
 19     dbms_output.put_line('SQL_Profile '||v_profile_name||' criada.');
 20     dbms_output.put_line('---------------------------------------------------------- ');
 21
 22  end;
 23  /
-----------------------------------------------------------
SQL_Profile SQLPROFILE_gb0h2ra62zg18 criada.
----------------------------------------------------------

Procedimento PL/SQL concluído com sucesso.

SQL >

 
Observe que na criação da profile acima estamos especificando um atributo “monitor” (linha 15) que vai ser responsável por forçar o SQL Monitor a capturar as informações dessa consulta.

3.3) Executar a consulta para captura pelo SQL Monitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
SQL > ALTER SESSION SET statistics_level=ALL;

Sessão alterada.

SQL >
SQL > ALTER SESSION SET current_schema = sh;

Sessão alterada.

SQL >
SQL >
SQL > SELECT /* dbtw003 */ count(1) Qtde
  2    FROM customers  c,
  3         sales      s
  4   WHERE c.cust_id = s.cust_id
  5     AND s.quantity_sold > 1;

      QTDE
----------
         4

SQL >
SQL >
SQL > column sql_id new_value m_sql_id
SQL > column child_number new_value m_child_no
SQL >
SQL > SELECT sql_id, child_number
  2    FROM v$sql
  3   WHERE sql_text LIKE '%dbtw003%'
  4     AND sql_text NOT LIKE '%v$sql%';

SQL_ID        CHILD_NUMBER
------------- ------------
gb0h2ra62zg18            0
gb0h2ra62zg18            1

SQL >
SQL >
SQL > SELECT *
  2    FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  gb0h2ra62zg18, child number 1
-------------------------------------
SELECT /* dbtw003 */ count(:"SYS_B_0") Qtde   FROM customers  c,
sales      s  WHERE c.cust_id = s.cust_id    AND s.quantity_sold >
:"SYS_B_1"

Plan hash value: 2841872969

---------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |      1 |        |      1 |00:00:01.47 |    4477 |   4439 |
|   1 |  SORT AGGREGATE       |              |      1 |      1 |      1 |00:00:01.47 |    4477 |   4439 |
|   2 |   NESTED LOOPS        |              |      1 |    166 |      4 |00:00:01.47 |    4477 |   4439 |
|   3 |    PARTITION RANGE ALL|              |      1 |    166 |      4 |00:00:01.47 |    4471 |   4439 |
|*  4 |     TABLE ACCESS FULL | SALES        |     28 |    166 |      4 |00:00:01.47 |    4471 |   4439 |
|*  5 |    INDEX UNIQUE SCAN  | CUSTOMERS_PK |      4 |      1 |      4 |00:00:00.01 |       6 |      0 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."QUANTITY_SOLD">:SYS_B_1)
   5 - access("C"."CUST_ID"="S"."CUST_ID")

Note
-----
   - SQL profile SQLPROFILE_gb0h2ra62zg18 used for this statement


29 linhas selecionadas.

SQL >

Na execução acima podemos observar na linha 71 que a profile gerada na etapa anterior foi utilizada.

3.4) Emitir o relatório do SQL Monitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
SQL > select sid,
  2         session_serial#,
 3         sql_id,
  4         sql_exec_id,
  5         to_char(sql_exec_start,'DD-Mon-YY HH24:MI:SS') sql_exec_start,
  6         sql_plan_hash_value plan_hash_value,
  7         elapsed_time/1000000 etime,
  8         buffer_gets,
  9         disk_reads
 10    from v$sql_monitor
 11   where sql_id = 'gb0h2ra62zg18';

       SID SESSION_SERIAL# SQL_ID        SQL_EXEC_ID SQL_EXEC_START       PLAN_HASH_VALUE      ETIME BUFFER_GETS DISK_READS
---------- --------------- ------------- ----------- -------------------- --------------- ---------- ----------- ----------
      1290            2327 gb0h2ra62zg18    33554433 24-Abr-17 21:16:40        2841872969   1,481456        4490        156

SQL >
SQL > set long 999999999
SQL > set lines 280
SQL > col report for a279
SQL > select DBMS_SQLTUNE.REPORT_SQL_MONITOR(session_id=> 1290, session_serial=> 2327, sql_id=> 'gb0h2ra62zg18', sql_exec_id=> '33554433', report_level=>'ALL') as report from dual;

REPORT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Monitoring Report

SQL Text
------------------------------
SELECT /* dbtw003 */ count(:"SYS_B_0") Qtde FROM customers c, sales s WHERE c.cust_id = s.cust_id AND s.quantity_sold > :"SYS_B_1"

Global Information
------------------------------
 Status              :  DONE (ALL ROWS)
 Instance ID         :  2
 Session             :  VALTER (1290:2327)
 SQL ID              :  gb0h2ra62zg18
 SQL Execution ID    :  33554433
 Execution Started   :  04/24/2017 21:16:40
 First Refresh Time  :  04/24/2017 21:16:40
 Last Refresh Time   :  04/24/2017 21:16:41
 Duration            :  1s
 Module/Action       :  SQL*Plus/-
 Service             :  ODBSRV01
 Program             :  sqlplus.exe
 Fetch Calls         :  1

Binds
========================================================================================================================
|   Name   | Position |  Type  |                                         Value                                         |
========================================================================================================================
| :SYS_B_1 |        2 | NUMBER | 1                                                                                     |
========================================================================================================================

Global Stats
=========================================================================================
| Elapsed |   Cpu   |    IO    | Application |  Other   | Fetch | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) | Calls |  Gets  | Reqs | Bytes |
=========================================================================================
|    1.48 |    0.04 |     1.35 |        0.04 |     0.05 |     1 |   4490 |  156 |  35MB |
=========================================================================================

SQL Plan Monitoring Details (Plan Hash Value=2841872969)
=========================================================================================================================================================
| Id |        Operation        |     Name     |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |   Activity Detail    |
|    |                         |              | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |     (# samples)      |
=========================================================================================================================================================
|  0 | SELECT STATEMENT        |              |         |      |         1 |     +1 |     1 |        1 |      |       |          |                      |
|  1 |   SORT AGGREGATE        |              |       1 |      |         1 |     +1 |     1 |        1 |      |       |          |                      |
|  2 |    NESTED LOOPS         |              |     166 | 1290 |         1 |     +1 |     1 |        4 |      |       |          |                      |
|  3 |     PARTITION RANGE ALL |              |     166 | 1290 |         1 |     +1 |     1 |        4 |      |       |          |                      |
|  4 |      TABLE ACCESS FULL  | SALES        |     166 | 1290 |         2 |     +0 |    28 |        4 |  155 |  35MB |   100.00 | direct path read (1) |
|  5 |     INDEX UNIQUE SCAN   | CUSTOMERS_PK |       1 |      |         1 |     +1 |     4 |        4 |      |       |          |                      |
=========================================================================================================================================================


SQL >

Conclusão

Nesse artigo verificamos na prática como utilizar o SQL Monitor para gerar um relatório com informações valiosas para analisar o desempenho de uma instrução SQL e identificar o possíveis pontos de melhoria, existem outras ferramentas que também fornecem essas informações, mas sem dúvida o SQL Monitor é uma ferramenta que agiliza muito a obtenção dessas informações.

Referências

http://kerryosborne.oracle-guy.com/2011/04/realtime-sql-monitoring-designed-with-exadata-in-mind/
 
 
 
 

Mídia social

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *