Como você obtém o plano de explicação?

10

Alguém pode explicar um pouco sobre o plano de explicação e como obter o plano de explicação para uma consulta. Além disso, se houver algum script sql que possa ser usado como utilitário para isso, isso seria ótimo.

user419534
fonte
11
"se houver algum script sql que possa ser usado como utilitário para isso" que tipo de utilitário você está procurando?
Derek Downey
2
Muitas ferramentas de desenvolvimento SQL têm GUIs muito fáceis de usar para obter planos de execução. O Oracle SQL Developer possui um. Você tem acesso a essas ferramentas ou deseja fazer isso especificamente a partir de scripts?
FrustratedWithFormsDesigner
Eu tenho o Oracle SQL Developer, mas gostaria de saber scripts.
User419534
2
Se você seguiu um curso com Jonathan Lewis , saberá que existem algo como 8 maneiras diferentes de obter um plano de execução do Oracle. Voto este comentário se você quiser que eu adicione uma resposta listando todos os diferentes métodos.
Colin 'Hart

Respostas:

9

Você pode usar o pacote DBMS_XPLAN :

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off
Vincent Malgrat
fonte
5

A instrução EXPLAIN PLAN exibe os planos de execução escolhidos pelo otimizador para as instruções SELECT, UPDATE, INSERT e DELETE. Um plano de execução de instrução é a sequência de operações que o banco de dados executa para executar a instrução.

EXPLAIN PLAN FOR ...

Substitua o ... pela sua instrução SQL. Depois de executar isso, execute o seguinte para visualizar o plano:

SELECT * FROM table(dbms_xplan.display);

Para obter mais informações, consulte as seções Visão geral ou Uso no Guia de ajuste de desempenho do Oracle 11g.

Leigh Riffel
fonte
1

Como é uma pergunta muito comum, decidi transformar essa resposta em um artigo .

O plano de execução estimado do SQL

O plano de execução estimado é gerado pelo Optimizer sem executar a consulta SQL. Você pode gerar o plano de execução estimado a partir de qualquer cliente SQL usando EXPLAIN PLAN FOR ou pode usar o Oracle SQL Developer para esta tarefa.

EXPLIQUE O PLANO PARA

Ao usar o Oracle, se você anexar o EXPLAIN PLAN FORcomando a uma consulta SQL específica, o banco de dados armazenará o plano de execução estimado nos associados PLAN_TABLE:

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Para visualizar o plano de execução estimado, você precisa usar DBMS_XPLAN.DISPLAY, conforme ilustrado no exemplo a seguir:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

A opção de formatação ALL + OUTLINE permite obter mais detalhes sobre o plano de execução estimado do que usar a opção de formatação padrão.

Desenvolvedor Oracle SQL

Se você instalou o SQL Developer, poderá obter facilmente o plano de execução estimado para qualquer consulta SQL sem precisar acrescentar o comando EXPLAIN PLAN FOR:

insira a descrição da imagem aqui

O plano de execução SQL real

O plano de execução real do SQL é gerado pelo Optimizer ao executar a consulta SQL. Portanto, diferentemente do plano de execução estimado, você precisa executar a consulta SQL para obter seu plano de execução real.

O plano real não deve diferir significativamente do estimado, desde que as estatísticas da tabela tenham sido coletadas adequadamente pelo banco de dados relacional subjacente.

Dica de consulta GATHER_PLAN_STATISTICS

Para instruir o Oracle a armazenar o plano de execução real para uma determinada consulta SQL, você pode usar a GATHER_PLAN_STATISTICSdica de consulta:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Para visualizar o plano de execução real, você pode usar DBMS_XPLAN.DISPLAY_CURSOR:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

Ativar STATISTICS no nível de conexão do banco de dados

Se você deseja obter os planos de execução para todas as consultas geradas em uma determinada sessão, é possível definir a configuração da STATISTICS_LEVELsessão como ALL:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Isso terá o mesmo efeito que definir a GATHER_PLAN_STATISTICSdica de consulta em todas as consultas de execução. Portanto, assim como na GATHER_PLAN_STATISTICSdica de consulta, você pode usar DBMS_XPLAN.DISPLAY_CURSORpara visualizar o plano de execução real.

Você deve redefinir a STATISTICS_LEVELconfiguração para o modo padrão assim que terminar de coletar os planos de execução nos quais estava interessado. Isso é muito importante, especialmente se você estiver usando o pool de conexões, e as conexões com o banco de dados forem reutilizadas.

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Vlad Mihalcea
fonte