Buenas! 🙂

Uma das atividades que mais demandam tempo, tato, expertise, xícaras de café, lágrimas, diálogo, consultas com o terapeuta, enfim… é o Tuning.

Com várias solicitações, e a obrigação de aprender o dito, resolvi documentar essa cruzada.

Quem sabe esse manual não é útil para algum de vocês que nos acompanham…

Não sou o dono da verdade, e o conteúdo aqui é baseado no meu entendimento de tuning e em materiais que estão disponíveis na internet. Todo material utilizado aqui será creditado.

Traduzindo Tuning…

O que é tuning?
– Basicamente é eliminar CUSTO desnecessário;
– Pode ser alcançado de diversos modos: criação de index, alteração de parâmetro, remodelagem, estatística, reescrita do SQL;

Planos de execução
– Atividades de manipulação ou consulta a dados previamente criam um plano de execução, o caminho mais fácil que o otimizador acredita percorrer para alcançar o resultado;
– O oracle nem sempre escolhe o melhor plano;
– Força-se um plano diferente utilizando o ‘HINT‘;

Gerando um plano de execução: (utilizando o ‘schema sample’ SCOTT que pode ser instalado junto com o banco)

delete plan_table;
commit;

EXPLAIN PLAN FOR
SELECT *
FROM   scott.emp e, scott.dept d
WHERE  e.deptno = d.deptno
AND    e.ename  = 'SMITH';

EXPLAIN PLAN succeeded.

select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'));
PLAN_TABLE_OUTPUT                                                                         
----------------------------------------------------------------------------------------- 
Plan hash value: 3625962092                                                               

----------------------------------------------------------------------------------------  
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |  
----------------------------------------------------------------------------------------  
|   0 | SELECT STATEMENT             |         |     1 |    58 |     4   (0)| 00:00:01 | -> Tipo de operação 
|   1 |  NESTED LOOPS                |         |       |       |            |          | -> Método de ligação 
|   2 |   NESTED LOOPS               |         |     1 |    58 |     4   (0)| 00:00:01 |  
|*  3 |    TABLE ACCESS FULL         | EMP     |     1 |    38 |     3   (0)| 00:00:01 | -> Método de acesso a tabela 
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 | -> Detalhamento do acesso a segunda tabela
|   5 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    20 |     1   (0)| 00:00:01 | -> Método de acesso a segunda tabela 
----------------------------------------------------------------------------------------  

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

   3 - filter("E"."ENAME"='SMITH')                                                        
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                  

18 rows selected

Rows:  Linhas selecionadas;
Bytes: Total de bytes selecionados;
Cost:  Custo de execução;

No próximo post iremos falar um pouco sobre os métodos de junção (join types)

Créditos:
http://www.devmedia.com.br/tuning-no-oracle-parte-01/8438
http://www.dba-oracle.com/art_sql_tune.htm
http://docs.oracle.com/cd/E11882_01/server.112/e16638/sql_overview.htm#PFGRF94798

o/
Att
Vitor Jr.