O processo de Tuning de instruções SQL não é uma tarefa fácil, existem ótimas ferramentas para auxiliar nesse trabalho, aquelas que requerem investimento normalmente não estão a nossa disposição nos ambientes onde trabalhamos. Neste artigo vamos listar 9 ferramentas de uso gratuito que podem ser baixadas e utilizadas sem custo,…
SQL Monitor: Como monitorar consultas rápidas?
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
Ajudo DBAs e analistas de sistema a se destacarem em suas empresas
e obter um crescimento mais acelerado em suas carreiras, quer saber mais click no link abaixo:
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/
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
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 !
Olá Jorge,
obrigado pelo reconhecimento.
Um forte abraço,
Valter Aquino
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.