O que é um plano de execução?
Pois bem, um plano de execução é literalmente o caminho que o banco de dados percorre para executar uma instrução SQL, isso mesmo, “o caminho” (guarde este conceito).
Imagine que você precise se deslocar de um ponto A para um ponto B, para fazer isso você vai percorrer um caminho e é isso que o banco de dados faz quando você executa um SELECT por exemplo, haverá vezes que será necessário que o banco de dados faça a leitura de uma tabela inteira, outras vezes ele se utilizará de um índice para localizar as informações desejadas de maneira mais curta e mais rápida e outras operações de acordo com o comando SQL enviado ao banco de dados.
Esses “caminhos” que juntos montam um plano de execução. E o plano de execução serve para que você entenda como o banco de dados está fazendo para processar os comandos SQL que você enviou, é a partir dele que você pode obter uma avaliação à respeito do comportamento de um comando SQL (se está bom ou ruim por exemplo).
Como se coletar um plano de execução?
Dentro do banco de dados há diversas formas de fazer a coleta do plano de execução, bem como diferentes fontes de informação para se construir esse plano. Vamos ver abaixo algumas formas de coletar os planos de execução.
#1 – EXPLAIN PLAN FOR:
Este comando está presente no SQL*Plus e em algumas outras IDEs também (como o SQL Developer), com ele você vai gerar um plano de execução “hipotético”.
Mas por que hipotético? A resposta é simples, porque com esse comando o Oracle basicamente lê a instrução SQL e faz uma estimativa de um possível plano que o “OPTIMIZER” vai usar, mas pode ser que quando o comando SQL for executado outro plano de execução seja gerado, isso porque na hora da execução o “OPTIMIZER” leva em consideração outros fatores como por exemplo parâmetros de sessão que podem influenciar diretamente em seu comportamento. Veja abaixo um pequeno exemplo:
#2 DBMS_XPLAN.DISPLAY_CURSOR():
Este método é o melhor para se utilizar, pois ele te dá o plano de execução real, ou seja aquele que o “OPTIMIZER” está a utilizar, logo, neste caso primeiramente a query precisa ser executada ou já estar dentro da SHARED_POOL para que na sequência você execute o comando para capturar o seu plano de execução. Vejamos alguns métodos de se fazer esta coleta.
#2.1 – Executando o comando SQL primeiro.
#2.2 Executando diretamente com o SQL_ID:
Gerar um plano de execução à partir de um SQL_ID, normalmente vai se aplicar aqueles casos onde você já sabe qual é o comando SQL que deseja analisar, imagine que você pode ter capturado essa informação à partir da view v$sql, de um statspack ou relatório AWR, ASH e etc.
Vamos usar um exemplo capturando o SQL_ID à partir da v$sql, então neste caso precisamos capturar o SQL_ID juntamente com o CHILD_NUMBER da instrução SQL desejada a partir da view v$sql.
Para isso você pode usar este select:
Depois de capturar as informações desejadas, basta executar a package DBMS_XPLAN.DISPLAY_CURSOR novamente, agora com os parâmetros necessários.
Mas agora atente-se pois será necessário além do SQL_ID e CHILD_NUMBER um outro parâmetro que informa como o plano de execução será exibido na tela, este parâmetro recebe quatro possíveis valores: basic, typical, serial e advanced (em um próximo artigo explico com detalhes os efeitos destes parâmetros) mas por hora vamos utilizar a opção ADVANCED.
Pois bem, basicamente essas são algumas das formas de se capturar planos de execução dentro do Oracle, existem outras maneiras que não abordamos aqui para não ficar um “textão” chato de ler.
Acredito que essas sejam essas as maneiras mais utilizadas e mais eficientes no dia a dia. Dentre elas, destaco a utilização da procedure DBMS_XPLAN.DIPLAY_CURSOR esta é a melhor maneira de se capturar os planos de execução.
Por hora é isso, mostramos aqui como coletar os planos de execução, nos próximos posts falarei mais como efetuar a leitura deles.
Te vejo no próximo post, tchau!