O que fazer para o Oracle analisar suas instruções SQL individuais e sugerir recomendações para melhorar seu desempenho?
Olá,
À partir do Oracle 10g, os supervisores (advisors) são ferramentas especializadas que ajudam o DBA a analisar o desempenho do banco de dados, identificar possíveis problemas e gargalos e ajustar os vários componentes do banco de dados. Alguns dos supervisores, como o supervisor ADDM e o supervisor de Segmento por exemplo, executam tarefas em seu banco de dados. Toda vez que um supervisor executa uma tarefa, ele executa sua análise e fornece os resultados dessa análise. No Oracle Enterprise Manager Database Control, os supervisores disponíveis no Supervisor Central são listados abaixo:
- ADDM fornece acesso aos recursos Automatic Database Diagnostic Monitor do Banco de Dados Oracle. Supervisor de Ajuste SQL Permite acesso a Top SQL, Conjuntos de Ajuste SQL, Snapshots e Linhas de Base, sendo que todos ajudam no ajuste de código SQL.
- Supervisor de Acesso SQL sugere maneiras de melhorar consultas SQL e a forma como essas consultas acessam dados subjacentes por meio do uso de índices e views materializadas. O desempenho das consultas SQL muitas vezes pode ser melhorado, criando-se estruturas adicionais, como Índices e Views Materializadas, que ajudam na recuperação de dados. O Supervisor de Acesso SQL também avalia as instruções SQL em uma carga de trabalho e pode sugerir índices e views materializadas que melhorarão o desempenho da carga de trabalho como um todo.
- Supervisor de Memória permite definir parâmetros de memória SGA e PGA é um grupo de estruturas de memória compartilhadas que contém dados e informações de controle para um sistema de banco de dados Oracle. A PGA é um buffer de memória que contém dados e informações de controle para um processo servidor.
- Supervisor MTTR fornece acesso à página Configurar Definições de Recuperação, em que é possível ajustar a definição MTTR (Mean Time to Recover, Tempo Médio de Recuperação) para o banco de dados.
- Gerenciamento de Undo permite definir detalhes de configuração para tablespace e retenção e permite acesso ao Supervisor de Undo que avalia o impacto de uma nova definição de retenção de undo.
- Supervisor de Desempenho avalia os objetos em relação ao uso do bloco e do espaço e determina se é possível obter espaço no tablespace compactando segmentos.
- Supervisor de Ajuste SQL (SQL Tuning Advisor) é utilizado para analisar instruções SQL individuais e fazer recomendações para melhorar seu desempenho.
Embora o Oracle EM Database Control possua uma interface que facilita o acesso ao SQL Tuning Advisor, às vezes executar um código PL/SQL via linha de comando também pode ser uma boa opção para o DBA e até mesmo para um desenvolvedor. Portanto, neste artigo abordarei especificamente o Supervisor de Ajuste SQL e como proceder para obter recomendações do otimizador utilizando o pacote DBMS_SQLTUNE via SQL*PLUS, já que o Oracle Express Edition não fornece uma interface de acesso a esta feature como o OEM Database Console oferece. Em resumo, utilizarei o Oracle Express Edititon para geração das tarefas de otimização de um SQL específico. Vamos então a um exemplo prático:
-- Irei preparar o ambiente de demonstração criando um schema de teste
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Qui Abr 17 22:22:37 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Conectado a:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> create user legatti identified by manager quota unlimited on users;
Usuário criado.
SQL> grant connect,resource,advisor to legatti;
Concessão bem-sucedida.
-- Irei conectar com o usuário criado anteriormente e criar duas tabelas
SQL> connect legatti/manager
Conectado.
-- Criação da tabela EMP (Empregados)
SQL> create table emp (
2 empno number(4) not null,
3 ename varchar2(10),
4 job varchar2(9),
5 mgr number(4),
6 hiredate date,
7 sal number(7,2),
8 comm number(7,2),
9 deptno number(2),
10 constraint pk_emp primary key (empno)
11 );
Tabela criada.
-- Criação da tabela DEPT (Departamentos)
SQL> create table dept (
2 deptno number(2) not null,
3 dname varchar2(14),
4 loc varchar2(13)
5 );
Tabela criada.
-- Carregando dados para a tabela EMP
SQL> insert into emp values (7369,'SMITH','CLERK',7902,'17/12/1980',800,NULL,20);
1 linha criada.
SQL> insert into emp values (7499,'ALLEN','SALESMAN',7698,'20/02/1981',1600,300,30);
1 linha criada.
SQL> insert into emp values (7521,'WARD','SALESMAN',7698,'20/02/1981',1250,500,30);
1 linha criada.
SQL> insert into emp values (7566,'JONES','MANAGER',7839,'20/02/1981',2975,NULL,20);
1 linha criada.
SQL>insert into emp values (7654,'MARTIN','SALESMAN',7698,'20/02/1981',1250,1400,30);
1 linha criada.
SQL> insert into emp values (7698,'BLAKE','MANAGER',7839,'20/02/1981',2850,NULL,30);
1 linha criada.
SQL> insert into emp values (7782,'CLARK','MANAGER',7839,'20/02/1981',2450,NULL,10);
1 linha criada.
SQL> insert into emp values (7788,'SCOTT','ANALYST',7566,'20/02/1981',3000,NULL,20);
1 linha criada.
SQL> insert into emp values (7839,'KING','PRESIDENT',NULL,'20/02/1981',5000,NULL,10);
1 linha criada.
SQL> insert into emp values (7844,'TURNER','SALESMAN',7698,'20/02/1981',1500,0,30);
1 linha criada.
SQL> insert into emp values (7876,'ADAMS','CLERK',7788,'20/02/1981',1100,NULL,20);
1 linha criada.
SQL> insert into emp values (7900,'JAMES','CLERK',7698,'20/02/1981',950,NULL,30);
1 linha criada.
SQL> insert into emp values (7902,'FORD','ANALYST',7566,'20/02/1981',3000,NULL,20);
1 linha criada.
SQL> insert into emp values (7934,'MILLER','CLERK',7782,'20/02/1981',1300,NULL,10);
1 linha criada.
-- Carregando dados para a tabela DEPT
SQL> insert into dept values (10,'ACCOUNTING','NEW YORK');
1 linha criada.
SQL> insert into dept values (20,'RESEARCH','DALLAS');
1 linha criada.
SQL> insert into dept values (30,'SALES','CHICAGO');
1 linha criada.
SQL> insert into dept values (40,'OPERATIONS','BOSTON');
1 linha criada.
SQL> commit;
Commit concluído.
-- SIMULAÇÃO 01 --
-- Irei simular a ausência de estatísticas para a tabela EMP
SQL> exec dbms_stats.delete_table_stats('LEGATTI','EMP');
Procedimento PL/SQL concluído com sucesso.
-- Irei simular a ausência de estatísticas para a tabela DEPT
SQL> exec dbms_stats.delete_table_stats('LEGATTI','DEPT');
Procedimento PL/SQL concluído com sucesso.
-- Irei criar uma tarefa de tuning SQL
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 l_sql VARCHAR2(500);
3 l_sql_tune_task_id VARCHAR2(100);
4 BEGIN
5 l_sql := 'SELECT emp.*,dept.* '||
6 'FROM emp '||
7 'INNER JOIN dept ON emp.deptno = dept.deptno '||
8 'CROSS JOIN dept e '||
9 'WHERE '||
10 '(NVL(empno,''0'') = :empno) and (dept.deptno = :deptno) '||
11 'and (job LIKE ''MA_%'' or job LIKE ''CL_%'' or job = ''EAD'') '||
12 'ORDER BY emp.job,emp.deptno';
13 l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
14 sql_text => l_sql,
15 bind_list => sql_binds(anydata.ConvertNumber(4),
16 anydata.ConvertNumber(2)),
17 user_name => 'LEGATTI',
18 scope => DBMS_SQLTUNE.scope_comprehensive,
19 time_limit => 60,
20 task_name => 'sql_emp_dept_tuning_task',
21 description => 'Tuning de SQL para a query contendo EMP e DEPT.');
22 DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
23 END;
24 /
l_sql_tune_task_id: sql_emp_dept_tuning_task
Procedimento PL/SQL concluído com sucesso.
-- Irei checar o status da tarefa de tuning SQL
SQL> select task_id,task_name,status from user_advisor_log;
TASK_ID TASK_NAME STATUS
---------- ------------------------------ -----------
271 sql_emp_dept_tuning_task INITIAL
-- Irei executar a tarefa de tuning SQL
SQL> exec dbms_sqltune.execute_tuning_task(task_name => 'sql_emp_dept_tuning_task');
Procedimento PL/SQL concluído com sucesso.
-- Irei checar novamente o status da tarefa para ver se a mesma já foi finalizada
SQL> select task_id,task_name,status from user_advisor_log;
TASK_ID TASK_NAME STATUS
---------- ------------------------------ -----------
271 sql_emp_dept_tuning_task COMPLETED
-- Irei executar o procedimento report() para visualizar as recomendações
SQL> set long 10000;
SQL> set longchunksize 1000
SQL> set pagesize 10000
SQL> set linesize 100
SQL> select dbms_sqltune.report_tuning_task('sql_emp_dept_tuning_task')
2 as recomendacoes from dual;
RECOMENDACOES
-------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : sql_emp_dept_tuning_task
Tuning Task Owner : LEGATTI
Scope : COMPREHENSIVE
Time Limit(seconds) : 60
Completion Status : COMPLETED
Started at : 04/17/2008 19:07:44
Completed at : 04/17/2008 19:07:45
Number of Statistic Findings : 2
Number of SQL Profile Findings : 1
Number of SQL Restructure Findings: 2
-------------------------------------------------------------------------------
Schema Name: LEGATTI
SQL ID : brvwtnz5ztms9
SQL Text : SELECT emp.*,dept.* FROM emp INNER JOIN dept ON emp.deptno =
dept.deptno CROSS JOIN dept e WHERE (NVL(empno,'0') = :empno)
and (dept.deptno = :deptno) and (job LIKE 'MA_%' or job LIKE
'CL_%' or job = 'EAD') ORDER BY emp.job,emp.deptno
-------------------------------------------------------------------------------
FINDINGS SECTION (5 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------
A tabela "LEGATTI"."DEPT" não foi analisada.
Recommendation
--------------
- Considere a coleta de estatísticas do otimizador para esta tabela
execute dbms_stats.gather_table_stats(ownname => 'LEGATTI', tabname =>
'DEPT', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO');
Rationale
---------
O otimizador requer estatísticas atualizadas para a tabela ao selecionar
um plano de execução adequado.
2- Statistics Finding
---------------------
A tabela "LEGATTI"."EMP" e seus índices não foram analisados.
Recommendation
--------------
- Considere a coleta de estatísticas do otimizador para esta tabela e seus
índices.
execute dbms_stats.gather_table_stats(ownname => 'LEGATTI', tabname =>
'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);
Rationale
---------
O otimizador de execução requer estatísticas para a tabela e seus índices
ao selecionar um plano de execução adequado.
3- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
Foi encontrado um plano de execução potencialmente melhor para esta
instrução.
Recommendation (estimated benefit<=10%)
---------------------------------------
- Considere a aceitação do perfil SQL recomendado.
execute dbms_sqltune.accept_sql_profile(task_name =>
'sql_emp_dept_tuning_task', replace => TRUE);
4- Restructure SQL finding (see plan 1 in explain plans section)
----------------------------------------------------------------
O predicado NVL("EMP"."EMPNO",0)=:B1 usado no ID de linha 4 do plano de
execução contém uma expressão na coluna indexada "EMPNO". Essa expressão
impede o otimizador de selecionar índices na tabela "LEGATTI"."EMP".
Recommendation
--------------
- Reescreva o predicado em um formato equivalente para tirar proveito de
índices. Como alternativa, crie um índice baseado na expressão.
Rationale
---------
O otimizador não pode usar um índice quando o predicado é uma condição de
desigualdade ou quando há uma expressão ou uma conversão de tipo de dados
implícita na coluna indexada.
5- Restructure SQL finding (see plan 1 in explain plans section)
----------------------------------------------------------------
Foi encontrada uma operação de produto cartesiano na linha de ID 2 do plano
de execução.
Recommendation
--------------
- Considere a remoção da tabela ou view desconectada dessa instrução ou
adicione uma condição de instrução que faça referência a ela.
Rationale
---------
Deve-se evitar um produto cartesiano sempre que possível porque ele é uma
operação de alto custo que pode produzir um grande volume de dados.
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original With Adjusted Cost
------------------------------
Plan hash value: 3377505029
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 147 | 11 (19)| 00:00:01 |
| 1 | SORT ORDER BY | | 3 | 147 | 11 (19)| 00:00:01 |
| 2 | MERGE JOIN CARTESIAN| | 3 | 147 | 10 (10)| 00:00:01 |
|* 3 | HASH JOIN | | 1 | 49 | 7 (15)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | EMP | 1 | 31 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | DEPT | 1 | 18 | 3 (0)| 00:00:01 |
| 6 | BUFFER SORT | | 4 | | 8 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL | DEPT | 4 | | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
4 - filter(NVL("EMP"."EMPNO",0)=:EMPNO AND "EMP"."DEPTNO"=:DEPTNO
AND ("EMP"."JOB"='EAD' OR "EMP"."JOB" LIKE 'MA_%' OR "EMP"."JOB" LIKE
'CL_%'))
5 - filter("DEPT"."DEPTNO"=:DEPTNO)
2- Using SQL Profile
--------------------
Plan hash value: 3641068790
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 147 | 11 (19)| 00:00:01 |
| 1 | SORT ORDER BY | | 3 | 147 | 11 (19)| 00:00:01 |
| 2 | MERGE JOIN CARTESIAN| | 3 | 147 | 10 (10)| 00:00:01 |
|* 3 | HASH JOIN | | 1 | 49 | 7 (15)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | DEPT | 1 | 18 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | EMP | 1 | 31 | 3 (0)| 00:00:01 |
| 6 | BUFFER SORT | | 4 | | 8 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL | DEPT | 4 | | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
4 - filter("DEPT"."DEPTNO"=:DEPTNO)
5 - filter(NVL("EMP"."EMPNO",0)=:EMPNO AND "EMP"."DEPTNO"=:DEPTNO
AND ("EMP"."JOB"='EAD' OR "EMP"."JOB" LIKE 'MA_%' OR "EMP"."JOB" LIKE
'CL_%'))
-------------------------------------------------------------------------------
-- Irei dropar a tarefa de tuning SQL
SQL> exec dbms_sqltune.drop_tuning_task (task_name => 'sql_emp_dept_tuning_task');
Procedimento PL/SQL concluído com sucesso.
-- SIMULAÇÃO 02 --
-- Irei dropar a chave primária da tabela EMP para ver se haverá alguma recomendação
SQL> alter table emp drop primary key;
Tabela alterada.
-- Irei criar uma nova tarefa de tuning SQL
SQL> DECLARE
2 l_sql VARCHAR2(500);
3 l_sql_tune_task_id VARCHAR2(100);
4 BEGIN
5 l_sql := 'SELECT a.*, b.* ' ||
6 'FROM emp a INNER JOIN dept b ON b.deptno = a.deptno ' ||
7 'WHERE empno = :empno';
8
9 l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
10 sql_text => l_sql,
11 bind_list => sql_binds(anydata.ConvertNumber(4)),
12 user_name => 'LEGATTI',
13 scope => DBMS_SQLTUNE.scope_comprehensive,
14 time_limit => 60,
15 task_name => 'sql_emp_dept_tuning_task',
16 description => 'Tuning de SQL para a query contendo EMP e DEPT.');
17 DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
18 END;
19 /
l_sql_tune_task_id: sql_emp_dept_tuning_task
Procedimento PL/SQL concluído com sucesso.
-- Irei checar o status da tarefa de tuning SQL
SQL> select task_id,task_name,status from user_advisor_log;
TASK_ID TASK_NAME STATUS
---------- ------------------------------ -----------
272 sql_emp_dept_tuning_task INITIAL
-- Irei executar a tarefa de tuning SQL
SQL> exec dbms_sqltune.execute_tuning_task(task_name => 'sql_emp_dept_tuning_task');
Procedimento PL/SQL concluído com sucesso.
-- Irei checar novamente o status da tarefa para ver se a mesma já foi finalizada
SQL> select task_id,task_name,status from user_advisor_log;
TASK_ID TASK_NAME STATUS
---------- ------------------------------ -----------
272 sql_emp_dept_tuning_task COMPLETED
-- Irei verificar se existe alguma recomendação
SQL> select dbms_sqltune.report_tuning_task('sql_emp_dept_tuning_task')
2 as recomendacoes from dual;
RECOMENDACOES
-------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : sql_emp_dept_tuning_task
Tuning Task Owner : LEGATTI
Scope : COMPREHENSIVE
Time Limit(seconds) : 60
Completion Status : COMPLETED
Started at : 04/17/2008 19:14:26
Completed at : 04/17/2008 19:14:27
Number of Statistic Findings : 2
Number of Index Findings : 1
-------------------------------------------------------------------------------
Schema Name: LEGATTI
SQL ID : 05n88kxuc6raw
SQL Text : SELECT a.*, b.* FROM emp a INNER JOIN dept b ON b.deptno =
a.deptno WHERE empno = :empno
-------------------------------------------------------------------------------
FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------
A tabela "LEGATTI"."DEPT" não foi analisada.
Recommendation
--------------
- Considere a coleta de estatísticas do otimizador para esta tabela
execute dbms_stats.gather_table_stats(ownname => 'LEGATTI', tabname =>
'DEPT', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO');
Rationale
---------
O otimizador requer estatísticas atualizadas para a tabela ao selecionar
um plano de execução adequado.
2- Statistics Finding
---------------------
A tabela "LEGATTI"."EMP" não foi analisada.
Recommendation
--------------
- Considere a coleta de estatísticas do otimizador para esta tabela
execute dbms_stats.gather_table_stats(ownname => 'LEGATTI', tabname =>
'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO');
Rationale
---------
O otimizador requer estatísticas atualizadas para a tabela ao selecionar
um plano de execução adequado.
3- Index Finding (see explain plans section below)
--------------------------------------------------
O plano de execução dessa instrução pode ser melhorado com a criação de um
ou mais índices.
Recommendation (estimated benefit: 100%)
----------------------------------------
- Considere a execução do Supervisor de Acesso para aumentar o projeto de
esquema físico ou a criação do índice recomendado.
create index LEGATTI.IDX$_01120001 on LEGATTI.EMP('EMPNO');
Rationale
---------
Criar os índices recomendados melhora significativamente o plano de
execução dessa instrução. No entanto, talvez seja preferível executar o
"Supervisor de Acesso" utilizando uma carga de trabalho SQL representativa
em oposição a uma única instrução. Isso permitirá a obtenção de
recomendações de índice abrangentes que levam em consideração o overhead
de manutenção de índice e um consumo de espaço adicional.
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original
-----------
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 117 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 117 | 7 (15)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 1 | 87 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("B"."DEPTNO"="A"."DEPTNO")
2 - filter("A"."EMPNO"=:EMPNO)
2- Using New Indices
--------------------
Plan hash value: 3550937623
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 117 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 87 | 0 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 1 | 117 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | DEPT | 4 | 120 | 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX$_01120001 | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("B"."DEPTNO"="A"."DEPTNO")
4 - access("A"."EMPNO"=:EMPNO)
-------------------------------------------------------------------------------
SQL> exec dbms_sqltune.drop_tuning_task (task_name => 'sql_emp_dept_tuning_task');
Procedimento PL/SQL concluído com sucesso.
Uma outra forma de capturar as recomendações fornecidas é executar a instrução SQL abaixo:
select
a.execution_end,
b.type,
b.impact,
d.rank,
d.type,
'Message : '||b.message MESSAGE,
'Command to correct: '||c.command COMMAND,
'Action Message : '||c.message ACTION_MESSAGE
from
user_advisor_tasks a,
user_advisor_findings b,
user_advisor_actions c,
user_advisor_recommendations d
where
a.task_id=b.task_id
and b.task_id=d.task_id and b.finding_id=d.finding_id
and a.task_id=c.task_id and d.rec_id=c.rec_id
and a.task_name like 'sql%' and a.status='COMPLETED'
order by b.impact, d.rank;
Outras procedures que podem ser executadas pelo DBMS_SQLTUNE:
-- Interromper e continuar a execução da tarefa
SQL> exec dbms_sqltune.interrupt_tuning_task (task_name => 'sql_emp_dept_tuning_task');
SQL> exec dbms_sqltune.resume_tuning_task (task_name => 'sql_emp_dept_tuning_task');
-- Cancelar a execução da tarefa
SQL> exec dbms_sqltune.cancel_tuning_task (task_name => 'sql_emp_dept_tuning_task');
-- Resetar a execução da tarefa permitindo a sua reinicialização
SQL> exec dbms_sqltune.reset_tuning_task (task_name => 'sql_emp_dept_tuning_task');
Usando o dicionário de dados Oracle:
As principais views de dicionário de dados utilizadas para recuperar informações do ADDM são:
- DBA_ADVISOR_TASKS: contém informações específicas sobre cada tarefa. A execução de uma análise ADDM é uma tarefa isolada (outras tarefas incluem execução dos vários consultores que serão apresentados em artigos posteriores);
- DBA_ADVISOR_RECOMMENDATIONS: esta view fornece as recomendações associadas com a execução específica de uma tarefa ADDM;
- DBA_ADVISOR_FINDINGS: esta view fornece os laudos associadas com uma execução específica de uma tarefa ADDM;
- DBA_ADVISOR_RATIONALE: esta view fornece as razões associadas com as recomendações específicas do ADDM.