dez 312015
 

Como temos dito em vários posts, o Oracle tem um poderoso otimizador de consultas, e dentre suas inúmeras funcionalidades, ele também é capaz de reescrever uma consulta para torná-la mais performática.

Ele tem várias técnicas de reescrita que eu pretendo descrever em outros posts.

Mas hoje eu gostaria de mostrar como verificar se um comando foi reescrito pelo Oracle, e como ficou o comando final.

Para fazer isso é muito fácil (vamos testar no 11.2.0.4), basta ativar um trace 10053, e no arquivo de trace gerado procurar pelo texto “Final quero after transformations:******* UNPARSED QUERY IS *******”.

Veja o seguinte exemplo:

  • Verificamos o arquivo de trace da sessão:
  • SQL> SELECT value FROM v$diag_info WHERE  name = 'Default Trace File';
    
    VALUE
    --------------------------------------------------------------------------------
    /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_30270.trc
    
  • Ativamos o trace:
  • SQL> ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
    
    Session altered.
    
  • Executamos o comando:
  • SQL> SELECT distinct id
    FROM test_table
    GROUP BY id; 2 3

    VAL
    ----------
    1
    2
    4
    5
    3

  • Desabilitamos o trace:
  • SQL> ALTER SESSION SET EVENTS '10053 trace name context off';
    
    Session altered.
    
  • E verificamos o arquivo de trace, lá vamos encontrar:
  • Final query after transformations:******* UNPARSED QUERY IS *******
    SELECT "TEST_TABLE"."ID" "ID" FROM "TESTE"."TEST_TABLE" "TEST_TABLE" GROUP BY "TEST_TABLE"."ID"
    

Podemos ver no exemplo acima que o Oracle eliminou o DISTINCT.
Ele transformou de:

SELECT distinct id FROM   test_table GROUP BY id;

para:

SELECT "TEST_TABLE"."ID" "ID" FROM "TESTE"."TEST_TABLE" "TEST_TABLE" GROUP BY "TEST_TABLE"."ID"

Muito fácil não é ?

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)