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>
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 |
---|---|
|
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. |
|
Identificador exclusivo atribuído a cada operação no plano de consulta. |
|
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. |
|
Nome da operação, por exemplo, Resultado, Filtro, TableScan, Junção etc. |
|
Nome do objeto referenciado por uma operação de varredura de tabela, por exemplo, tabela, exibição materializada ou exibição segura. |
|
Alias de um objeto referenciado, se o objeto tiver recebido um alias na consulta. |
|
Lista de expressões relevantes para a operação atual, tais como filtros, predicados de junção, projeções, agregações etc. |
|
O número total de micropartições no objeto de banco de dados referenciado. |
|
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. |
|
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);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 | +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+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} | | | +------------------------------------------------------------------------------------------------------------------------------------+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}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+