EXPLAIN

Retorna o plano de execução lógica para a instrução SQL especificada.

Um plano explicativo mostra as operações (por exemplo, varreduras de tabela e junções) que o Snowflake realizaria para executar a consulta.

Consulte também:

SYSTEM$EXPLAIN_PLAN_JSON , SYSTEM$EXPLAIN_JSON_TO_TEXT , EXPLAIN_JSON

Sintaxe

EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
Copy

Parâmetros

statement

Esta é a instrução SQL para a qual você quer o plano de explicação.

USING output_format

Esta cláusula opcional especifica o formato de saída. Os formatos de saída possíveis são:

  • JSON: a saída JSON é mais fácil de armazenar em uma tabela e consulta.

  • TABULAR: a saída tabular é geralmente mais fácil de ler pelo homem do que a saída JSON.

  • TEXT: a saída de texto formatado é geralmente mais fácil de ler pelo homem do que a saída JSON.

O padrão é TABULAR.

Saída

A saída contém as seguintes informações:

Coluna

Descrição

step

A maioria das consultas contém uma única etapa, mas algumas são executadas como múltiplas etapas distintas. Esta coluna denota a qual etapa a operação pertence.

id

Identificador exclusivo atribuído a cada operação no plano de consulta.

parentOperators

Matriz de identificadores para os nós pais da operação. No perfil de consulta, um pai é mostrado acima de seu filho com um link ligando os dois.

operation

Nome da operação, por exemplo, Resultado, Filtro, TableScan, Junção etc.

objects

Nome do objeto referenciado por uma operação de varredura de tabela, por exemplo, tabela, exibição materializada ou exibição segura.

alias

Alias de um objeto referenciado, se o objeto tiver recebido um alias na consulta.

expressions

Lista de expressões relevantes para a operação atual, tais como filtros, predicados de junção, projeções, agregações etc.

totalPartitions

O número total de micropartições no objeto de banco de dados referenciado.

assignedPartitions

O número de partições do objeto referenciado que são deixadas após a remoção do tempo de compilação, ou seja, o número de partições que podem ser digitalizadas pela consulta.

assignedBytes

O número de bytes contidos em assignedPartitions.

Notas de uso

  • EXPLAIN compila a instrução SQL, mas não a executa, portanto EXPLAIN não requer um warehouse em funcionamento.

  • Embora EXPLAIN não consuma nenhum crédito de computação, a compilação da consulta consome créditos do serviço de nuvem, assim como outras operações de metadados.

  • Para pós-processar a saída deste comando, você pode:

    • Usar a função RESULT_SCAN, que trata a saída como uma tabela que pode ser consultada.

    • Gerar a saída no formato JSON e inserir a saída no formato JSON em uma tabela para análise posterior. Se você armazenar a saída no formato JSON, você pode usar a função SYSTEM$EXPLAIN_JSON_TO_TEXT ou EXPLAIN_JSON para converter o JSON em um formato legível para humanos (seja tabular ou texto formatado).

  • Os valores assignedPartitions e assignedBytes são estimativas de limite superior para a execução da consulta. Otimizações de tempo de execução como a redução da junção podem diminuir o número de partições e bytes digitalizados durante a execução da consulta.

  • O plano EXPLAIN é o plano “lógico” de explicação. Mostra as operações que serão realizadas e sua relação lógica umas com as outras. A ordem real de execução das operações no plano não corresponde necessariamente à ordem lógica mostrada pelo plano.

  • Se algum dos objetos de banco de dados da declaração EXPLAIN for um objeto INFORMATION_SCHEMA, a instrução falhará com o erro EXPLAIN command has insufficient privilege on object <objName>.

Exemplos

Este exemplo mostra a saída EXPLAIN para uma simples consulta em duas pequenas tabelas.

Criar as tabelas:

CREATE TABLE Z1 (ID INTEGER);
CREATE TABLE Z2 (ID INTEGER);
CREATE TABLE Z3 (ID INTEGER);
Copy

Gerar o plano EXPLAIN em formato tabular para a consulta:

EXPLAIN USING TABULAR SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
| step | id   | parentOperators | operation   | objects                      | alias | expressions              | partitionsTotal | partitionsAssigned | bytesAssigned |
|------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------|
| NULL | NULL |            NULL | GlobalStats | NULL                         | NULL  | NULL                     |               2 |                  2 |          1024 |
|    1 |    0 |            NULL | Result      | NULL                         | NULL  | Z1.ID, Z2.ID             |            NULL |               NULL |          NULL |
|    1 |    1 |             [0] | InnerJoin   | NULL                         | NULL  | joinKey: (Z2.ID = Z1.ID) |            NULL |               NULL |          NULL |
|    1 |    2 |             [1] | TableScan   | TESTDB.TEMPORARY_DOC_TEST.Z2 | NULL  | ID                       |               1 |                  1 |           512 |
|    1 |    3 |             [1] | JoinFilter  | NULL                         | NULL  | joinKey: (Z2.ID = Z1.ID) |            NULL |               NULL |          NULL |
|    1 |    4 |             [3] | TableScan   | TESTDB.TEMPORARY_DOC_TEST.Z1 | NULL  | ID                       |               1 |                  1 |           512 |
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
Copy

Gerar o plano EXPLAIN para a consulta como texto formatado:

EXPLAIN USING TEXT SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+------------------------------------------------------------------------------------------------------------------------------------+
| content                                                                                                                            |
|------------------------------------------------------------------------------------------------------------------------------------|
| GlobalStats:                                                                                                                       |
|     partitionsTotal=2                                                                                                              |
|     partitionsAssigned=2                                                                                                           |
|     bytesAssigned=1024                                                                                                             |
| Operations:                                                                                                                        |
| 1:0     ->Result  Z1.ID, Z2.ID                                                                                                     |
| 1:1          ->InnerJoin  joinKey: (Z2.ID = Z1.ID)                                                                                 |
| 1:2               ->TableScan  TESTDB.TEMPORARY_DOC_TEST.Z2  ID  {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512}      |
| 1:3               ->JoinFilter  joinKey: (Z2.ID = Z1.ID)                                                                           |
| 1:4                    ->TableScan  TESTDB.TEMPORARY_DOC_TEST.Z1  ID  {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} |
|                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------+
Copy

Gerar o plano EXPLAIN para a consulta como JSON:

EXPLAIN USING JSON SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| content                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| {"GlobalStats":{"partitionsTotal":2,"partitionsAssigned":2,"bytesAssigned":1024},"Operations":[[{"id":0,"operation":"Result","expressions":["Z1.ID","Z2.ID"]},{"id":1,"parentOperators":[0],"operation":"InnerJoin","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":2,"parentOperators":[1],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z2"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512},{"id":3,"parentOperators":[1],"operation":"JoinFilter","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":4,"parentOperators":[3],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z1"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512}]]} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Copy