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/
 
 
Promo-D75L

video-02
 
 
 
 
 
 
 
 
 
 
 
 
 
 

5 comments

  • Jorge Luiz Vaz

    O Oracle Standard Edition possibilita o uso da OPTIONS DIAGNOSTIC PACK AND TUNING PACK, apesar de não poder utilizá-lo, pois é uma option do EE. Agora vem a pergunta : O parâmetro CONTROL_MANAGEMENT_PACK_ACCESS deve estar configurado como NONE, mas, é muito facil trocar para DIAGNOSTIC+TUNING condição essa que me fez-me aproveitar o AWR e seus advisors sem saber e que trouxe dores de cabeça para Empresa que trabalho. Existe uma forma de desinstalr essa option no SE, visto que, em dois cliques do OEM, habilitamos facilmente ? A versão que utilizo é 11.2.0.4

    • Olá Jorge Luiz,
      Oficialmente a maneira de desativar as OPTIONS DIAGNOSTIC PACK AND TUNING PACK é através do parâmetro CONTROL_MANAGEMENT_PACK_ACCESS, porem esta desativação é pra Inglês ver pois mesmo colocando este parâmetro como NONE se você fizer um select na visão V$ACTIVE_SESSION_HISTORY as options serão marcadas como utilizadas. Para saber exatamente quais objetos do banco você não pode acessar consulte a documentação da Oracle: https://docs.oracle.com/cd/B28359_01/license.111/b28287/options.htm#DBLIC164

      Espero ter esclarecido sua dúvida, se não, fique a vontade para perguntar.

      Um forte abraço,
      Valter Aquino

  • Jorge Luiz Vaz

    Seu artigo é TOP. Mas, tenho um pequeno problema relacionado ao parâmetro CONTROL_MANAGEMENT_PACK_ACCESS= DIAGNOSTIC+TUNING. Não posso habilitá-lo, porque uso o STANDARD EDITION. Mas, de qualquer forma é sempre bom aprender algo interessante. Parabéns pelo artigo !

  • Jorge Luiz Vaz

    O problema é que eles quebraram o Banco com essa versão de Entrada(SE). Todas as features que eles não disponibilizam são de ajuste de sintonia e o AWR, é uma mão na roda. Agora é se contentar com STATSPACK. As partes interessantes ficaram de fora, como grau de paralelização, partigions table, algumas compressões para LOBS. Se for enumerar, são tantas que parece que vc tem um outro Oracle na mão. E o grande problema é a diferença Abissal de preço entre essas duas plataformas. A Empresa conversou com o pessoal da Oracle e eles propuzeram o ODA, que a priori é muito interessante. Realmente, isso dificulta a parte de tuning.

Deixe uma resposta

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