Como executar sql tuning advisor oráculo de 12c
A Oracle 12c oferece um utilitário útil chamado o SQL Tuning Advisor. Você pode usar essa ferramenta built-in para fornecer sugestões ou recomendações sobre certas instruções SQL. Embora nem sempre pode dar conselhos perfeito, como qualquer outra coisa, tê-lo em sua caixa de ferramentas de técnicas de ajuste é benéfico.
Video: VTS: SQL Tuning Without Trying - Arup Nanda
Use PL / SQL eo DBMS_SQL_TUNE pacote interno para criar uma tarefa de afinação. Digite o seguinte:
Video: SQL Server Tuning
DECLAREl_sqlVARCHAR2 (500) -l_sql_tune_task_id VARCHAR2 (100) -BEGINl_sql: = `SELECT first_name, last_name, department_name` || `FROM emp Cadastre departamentos USANDO (department_id)` || `WHERE last_name = `` Hopkins` `` - l_sql_tune_task_id: = DBMS_SQLTUNE.create_tuning_task (sql_text = gt; l_sql, nome_de_acesso = gt; `RH`, = âmbito gt; DBMS_SQLTUNE.scope_comprehensive, time_limit = gt; 60, nome_tarefa = gt; `emp_dept_tuning_task`, = descrição gt; `tarefa optimização para um EMP ao departamento de consulta de junção `) - DBMS_OUTPUT.PUT_LINE (` l_sql_tune_task_id:. `|| l_sql_tune_task_id) -END- /
Você deve ver o seguinte:
Procedimento PL / SQL concluído com êxito.
No comando anterior, observe o TIME_LIMIT de 60. Isso limita o tempo de processamento para 60 segundos. Você não pode sempre quer executar algo parecido com isso por longos períodos em seu banco de dados, porque ele incorre em sobrecarga do sistema.
Execute o conselheiro sintonia com a sua tarefa, digitando o seguinte:
EXEC DBMS_SQLTUNE.execute_tuning_task (nome_tarefa = gt; `emp_dept_tuning_task`) -
Devido ao limite de 60 segundos fornecidas na criação da tarefa, esta etapa pode demorar até 60 segundos para ser concluído. Durante este tempo, o prompt não vai voltar.
Quando concluída, você deve ver o seguinte:
Procedimento PL / SQL concluído com êxito.
Se tiver definido um longo tempo e estão ficando impacientes, você pode abrir outra janela SQL para se certificar de que a tarefa ainda está em execução, digitando
task_name SELECT, status, execution_startFROM dba_advisor_log ONDE proprietário = `HR`-
Você vê algo como o seguinte:
TASK_NAME STATUS EXECUTION_START ------------------------------ --------------- - ------------------ emp_dept_tuning_task EXECUTING19-JUL-2013 15:35:42
Quando a execução estiver concluída, você pode visualizar os resultados através da execução do procedimento BMS_SQLTUNE.report_tuning_task. Digite o seguinte:
SELECTDBMS_SQLTUNE.report_tuning_task ( `emp_dept_tuning_task`) AS recommendationsFROM dual
Por uma questão de espaço, que já cortou algumas seções da saída que se segue, mas você vê algo como isto:
RECOMENDAÇÕES ------------------------------------------------- -------------------------------- INFORMAÇÃO GERAL SECÇÃO --------------- -------------------------------------------------- ---------------- Ajuste Nome da Tarefa: emp_dept_tuning_taskTuning Task proprietário: Tipo HRWorkload: Single SQL StatementScope: Limite COMPREHENSIVETime (segundos): 60Completion status: INTERRUPTEDStarted em: 2013/07/19 15: 21: 39Completed em: 2013/07/19 15:22:43 ----------------------------------- ---------------------------------------------- Erro: ORA 13639: A operação atual foi interrompida porque expirou .-------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------ Nome de esquema: HRSQL ID: 47uvvzcuu5mdgSQL Texto: first_name SELECT, last_name, department_name DE JOINdepartments emp UTILIZAÇÃO (department_id) ONDE last_name = ` Hopkins`RECOMMENDATIONS ----------------------------------------------- --------- -------------------------------------------------- -------------------------------------------------- ------ RESULTADOS SEÇÃO (1 constatação) -------------------------------------- ------------------------------------------- 1- Índice Finding (veja explicar planeja seção abaixo) ---------------------------------------------- ---- O plano de execução desta declaração pode ser melhorada através da criação de um ou moreindices.Recommendation (benefício estimado: 99,98%) ----------------------- -------------------- Considere executar o Conselheiro Acesso para melhorar o esquema físico designor criar o HR.IDX índice index.create recomendado $$ _ 03170001 em HR.EMP ("ÚLTIMO NOME") -Rationale --------- Criando os índices recomendados melhora significativamente a execução planof esta declaração. No entanto, pode ser preferível correr "Access Advisor"usando uma carga de trabalho SQL representante em oposição a uma única instrução. Thiswill permitem obter recomendações índice abrangente que leva intoRECOMMENDATIONS ---------------------------------------- ---------------------------------------- sobrecarga de manutenção do índice de conta e o consumo de espaço adicional .. ..output cortou ...
A última parte do relatório mostra o antes e depois de planos de execução. Neste caso, você já viu o antes quando estavam gerando planos de execução. Vá em frente e adicionar o índice, regenerar o plano de execução, e veja se você fez uma melhoria.
Antes de adicionar o índice, note que as recomendações dar o SQL para adicionar o índice:
Recomendação (benefício estimado: 99,98%) ------------------------------------------ - Considere a execução do Advisor Acesso para melhorar o esquema físico designor criar o HR.IDX índice index.create recomendado $$ _ 03170001 em HR.EMP ("ÚLTIMO NOME") -
Observe também que a Oracle dá um aviso:
RECOMENDAÇÕES ------------------------------------------------- ------------------------------- sobrecarga de manutenção do índice de conta e o consumo de espaço adicional.
Adicionar o índice com seu próprio nome, digitando o seguinte:
CREATE INDEX emp_last_name_idx ON emp (last_name) -
Você deve ver algo como o seguinte:
Índice criado.
Dê uma olhada no plano de execução. Digite o seguinte:
explicar plano first_name forSELECT, last_name, department_nameFROM emp juntar departamentos usando (department_id) ONDE last_name = `Hopkins-Explained.Elapsed: 00: 00: 00,09
E digite
@? Rdbmsadminutlxpls
Você deverá ver uma saída como esta:
PLAN_TABLE_OUTPUT ------------------------------------------------- -------------------------------- Plano valor de hash: 1505300146 ------------- -------------------------------------------------- ------------------ | Id | operação | Nome | linhas | bytes | Custo (% CPU) | Tempo | ------------------------------------------------ --------------------------------- | 0 | Instrução SELECT | | 1 | 34 | 5 (0) | 00:00:01 || 1 | Nested Loops | ||| ||| 2 | Nested Loops | | 1 | 34 | 5 (0) | 00:00:01 || 3 | Acessar a tabela pelo índice ROWID batched | EMP | 1 | 18 | 4 (0) | 00:00:01 || * 4 | ÍNDICE GAMA SCAN | EMP_LAST_NAME_IDX | 1 || 3 (0) | 00:00:01 || * 5 | UNIQUE INDEX SCAN | DEPT_ID_PK | 1 || 0 (0) | 00:00:01 || 6 | ACESSO tabela por ROWID ÍNDICE | DEPARTAMENTOS | 1 | 16 | 1 (0) | 00:00:01 | -------------------------------------------- ------------------------------------- Informação predicado (identificado pelo código de operação): ---- ----------------------------------------------- 4 - acesso ("EMP"."ÚLTIMO NOME"= `Hopkins) 5 - Acesso ("EMP"."DEPARTMENT_ID"="DEPARTAMENTOS"."DEPARTMENT_ID")
Agora que você adicionou o índice, algumas coisas são evidentes:
O custo do plano caiu 40336-5.
Há agora seis etapas.
A varredura completa da tabela está desaparecido. Em vez disso você vê o uso de seu novo índice.
Muitas vezes uma das partes difíceis sobre ajustar um banco de dados é ter uma sólida compreensão da aplicação e os dados. A questão pode não ser sempre óbvio. Às vezes envolver outros especialistas em aplicações e dados ajuda.
Explicar-lhes as suas descobertas e o que você propõe. Eles podem ser capazes de ajudá-lo a chegar a uma conclusão. Além disso, se os dados são parte de um aplicativo de terceiros embalado, às vezes abrindo um ticket com o fornecedor é o caminho a percorrer.