Oracle: Entendendo o SQL Explain Plan

From Wiki
Revision as of 15:44, 12 February 2022 by Ebasso (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Referência https://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm

Coletando o Explain

EXPLAIN PLAN FOR
SELECT e.employee_id, j.job_title, e.salary, d.department_name
   FROM employees e, jobs j, departments d
   WHERE  e.employee_id < 103
      AND e.job_id = j.job_id 
      AND e.department_id = d.department_id;

Gerando o output com o comando

select * from table(dbms_xplan.display)

Output

-----------------------------------------------------------------------------------
| Id  | Operation                     |  Name        | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     3 |   189 |    10  (10)|
|   1 |  NESTED LOOPS                 |              |     3 |   189 |    10  (10)|
|   2 |   NESTED LOOPS                |              |     3 |   141 |     7  (15)|
|*  3 |    TABLE ACCESS FULL          | EMPLOYEES    |     3 |    60 |     4  (25)|
|   4 |    TABLE ACCESS BY INDEX ROWID| JOBS         |    19 |   513 |     2  (50)|
|*  5 |     INDEX UNIQUE SCAN         | JOB_ID_PK    |     1 |       |            |
|   6 |   TABLE ACCESS BY INDEX ROWID | DEPARTMENTS  |    27 |   432 |     2  (50)|
|*  7 |    INDEX UNIQUE SCAN          | DEPT_ID_PK   |     1 |       |            |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
  3 - filter("E"."EMPLOYEE_ID"<103)
  5 - access("E"."JOB_ID"="J"."JOB_ID")
  7 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")


Termos:

Índices e acesso à tabela

TABLE ACCESS FULL Lê a tabela inteira — todas as linhas e colunas — conforme armazenada no disco. É uma das operações mais caras.

INDEX UNIQUE SCAN O INDEX UNIQUE SCAN executa apenas uma B-tree traversal . O BD usa essa operação se uma restrição exclusiva garantir que os critérios de pesquisa não correspondam a mais de uma entrada.

INDEX RANGE SCAN O INDEX RANGE SCAN realiza a uma B-tree traversal e segue a "leaf node chain" para encontrar todas as entradas correspondentes.

INDEX FULL SCAN Lê todas as linhas do índice. Dependendo de várias estatísticas do sistema, o BD pode executar essa operação se precisar de todas as linhas na ordem do índice - por exemplo, devido a uma cláusula correspondente de ordem por. Em vez disso, o otimizador também pode usar um INDEX FAST FULL SCAN e executar uma operação de classificação adicional.

INDEX FAST FULL SCAN Lê todas as linhas do índice, conforme armazenado no disco. Essa operação geralmente é executada em vez de uma verificação completa da tabela se todas as colunas necessárias estiverem disponíveis no índice. Semelhante ao TABLE ACCESS FULL, o INDEX FAST FULL SCAN pode se beneficiar de operações de leitura de vários blocos.

TABLE ACCESS BY INDEX ROWID Recupera uma linha da tabela usando o ROWID recuperado da pesquisa de índice anterior.


Associations

operações de join, processam apenas duas tabelas por vez.

NESTED LOOPS JOIN Une duas tabelas buscando o resultado de uma tabela e consultando a outra tabela para cada linha da primeira.

HASH JOIN A junção de hash carrega os registros candidatos de um lado da junção em uma tabela de hash que é então sondada para cada linha do outro lado da junção.

MERGE JOIN A junção de join combina duas listas classificadas como um zíper. Ambos os lados da junção devem ser pré-classificados.

Classificando e Agrupamento

SORT ORDER BY Classifica o resultado de acordo com a cláusula order by. Utiliza muita memória para gerar o resultado intermediário.

SORT ORDER BY STOPKEY Classifica um subconjunto do resultado de acordo com a cláusula order by. Usado para consultas top-N se a execução em pipeline não for possível.

SORT GROUP BY Classifica o conjunto de resultados no grupo por colunas e agrega o resultado classificado em uma segunda etapa. Utiliza muita memória para gerar o resultado intermediário (não em pipeline).

SORT GROUP BY NOSORT Agrega um conjunto pré-classificado de acordo com a cláusula group by. Esta operação não armazena em buffer o resultado intermediário: ela é executada em pipeline.

HASH GROUP BY Agrupa o resultado usando uma tabela de hash. Utiliza muita memória para gerar o resultados intermediário (não em pipeline). A saída não é ordenada de forma significativa.

COUNT STOPKEY Aborta as operações subjacentes quando o número desejado de linhas foi buscado.

WINDOW NOSORT STOPKEY Usa uma função de janela (cláusula over) para abortar a execução quando o número desejado de linhas foi buscado.


Ver também