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.
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.
Respostas:
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
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.
Como é uma pergunta muito comum, decidi transformar essa resposta em um artigo .
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.
Ao usar o Oracle, se você anexar o EXPLAIN PLAN FOR
comando 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.
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:
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.
Para instruir o Oracle a armazenar o plano de execução real para uma determinada consulta SQL, você pode usar a GATHER_PLAN_STATISTICS
dica 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'))
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_LEVEL
sessão como ALL:
ALTER SESSION SET STATISTICS_LEVEL='ALL'
Isso terá o mesmo efeito que definir a GATHER_PLAN_STATISTICS
dica de consulta em todas as consultas de execução. Portanto, assim como na GATHER_PLAN_STATISTICS
dica de consulta, você pode usar DBMS_XPLAN.DISPLAY_CURSOR
para visualizar o plano de execução real.
Você deve redefinir a
STATISTICS_LEVEL
configuraçã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'