EXPLAIN
Exibe o plano de execução para uma instrução de consulta sem executar a consulta. Para obter informações sobre o fluxo de trabalho de análise de consultas, consulte Fluxo de trabalho da análise de consulta.
Sintaxe
EXPLAIN [ VERBOSE ] query
Parâmetros
- VERBOSE
-
Exibe o plano completo da consulta em vez de apenas um resumo.
- query
-
Instrução da consulta a ser explicada. A consulta pode ser uma instrução SELECT, INSERT, CREATE TABLE AS, UPDATE ou DELETE.
Observações de uso
Às vezes, a performance do comando EXPLAIN é influenciado pelo tempo que ele leva para criar tabelas temporárias. Por exemplo, uma consulta que usa otimização comum de subexpressão requer tabelas temporárias para ser criada e analisada para retornar a saída EXPLAIN. O plano da consulta depende do esquema e das estatísticas das tabelas temporárias. Portanto, para esse tipo de consulta, o comando EXPLAIN pode levar mais tempo para ser executado que o esperado.
Você pode usar EXPLAIN somente com os seguintes comandos:
-
SELECT
-
SELECT INTO
-
CREATE TABLE AS
-
INSERT
-
UPDATE
-
DELETE
O comando EXPLAIN falhará se você o usar para outros comandos SQL, como data definition language (DDL) ou operações de banco de dados.
Os custos unitários relativos da saída EXPLAIN são usados pelo Amazon Redshift para escolher um plano de consulta. O Amazon Redshift compara os tamanhos de várias estimativas de recursos para determinar o plano.
Planejamento de consulta e etapas de execução
O plano de execução de uma instrução de consulta específica do Amazon Redshift divide a execução e o cálculo de uma consulta em uma sequência diferente de etapas e operações de tabela que, por fim, produz um conjunto de resultados finais para a consulta. Para obter informações sobre consulta paralela, consulte Processamento de consulta.
A tabela a seguir fornece um resumo de etapas que o Amazon Redshift pode usar para desenvolver um plano de execução para qualquer consulta enviada por um usuário para execução.
Operadores EXPLAIN | Etapas de execução da consulta | Descrição |
---|---|---|
SCAN: | ||
Sequential Scan | scan | Operador ou etapa de varredura de relação ou de varredura de tabela do Amazon Redshift. Faz a varredura da tabela inteira sequencialmente do começo ao fim. Além disso, avalia as restrições de consulta de cada linha (Filtro), caso especificada na cláusula WHERE. Também é usado para executar as instruções INSERT, UPDATE e DELETE. |
JOINS: o Amazon Redshift usa operadores de junção diferentes com base no design físico das tabelas sendo juntadas, na localização dos dados necessários para a junção e nos atributos específicos da própria consulta. Varredura de subconsulta -- A varredura e a anexação de subconsulta são usadas para executar consultas UNION. | ||
Loop aninhado | nloop | A junção menos ideal; usada sobretudo para junções cruzadas (produtos cartesianos, sem condição de junção) e algumas junções de desigualdade. |
Hash Join | hjoin | Também usada para junções externas (esquerda e direita) e internas. Costuma ser mais rápida do que uma junção de loop aninhado. A junção hash lê a tabela externa, executa o hash nas coluna de junção e encontra correspondências na tabela interna de hash. A etapa pode incorrer em um vazamento para o disco. (A entrada interna de hjoin é uma etapa de hash que pode ser baseada em disco.) |
Merge Join | mjoin | Também usada para junções internas e externas (para juntar tabelas que são distribuídas e classificadas nas colunas de junção). Normalmente o algoritmo mais rápido de junção do Amazon Redshift, sem incluir outras considerações de custos. |
AGREGAR: Operadores e etapas usados para consultas que envolvem funções agregadas e operações GROUP BY. | ||
Aggregate | aggr | Operador/etapa para funções agregadas escalares. |
HashAggregate | aggr | Operador/etapa para funções agregadas agrupadas. Pode operar a partir do disco como consequência de vazamento de uma tabela de hash para o disco. |
GroupAggregate | aggr | Operador escolhido às vezes para consultas agregadas agrupadas se a configuração do Amazon Redshift para force_hash_grouping está desativada. |
CLASSIFICAR: Operadores e etapas usados quando as consultas têm que classificar ou mesclar conjuntos de resultados. | ||
Sort | sort | Classificar realiza a classificação especificada pela cláusula ORDER BY, assim como outras operações, como junções e consultas UNION. Pode operar a partir do disco. |
Merge | merge | Produz resultados finais classificados de uma consulta com base em resultados intermediários classificados derivados de operações realizadas em paralelo. |
Operações EXCEPT, INTERSECT e UNION: | ||
SetOp Except [Distinct] | hjoin | Usado para consultas EXCEPT. Pode operar a partir do disco em virtude do fato de que o hash de entrada pode ser baseado em disco. |
Hash Intersect [Distinct] | hjoin | Usado para consultas INTERSECT. Pode operar a partir do disco em virtude do fato de que o hash de entrada pode ser baseado em disco. |
Append [All |Distinct] | save | Anexo usado com a Varredura de subconsulta para implementar as consultas UNION e UNION ALL. Pode operar a partir do disco em virtude de “Save.” |
Diversos/Outros: | ||
Hash | hash | Usado para fazer junções internas e junções externas (esquerda e direita). Fornece entrada para uma junção hash. O operador Hash cria a tabela de hash para a tabela interna de uma junção. (A tabela interna é a tabela verificada para ver se há correspondências e, em uma junção de duas tabelas, geralmente é a menor das duas.) |
Limite | limite | Avalia a cláusula LIMIT. |
Materialize | save | Materializa linhas para entrada em junções de loop aninhado e algumas junções de mesclagem. Pode operar a partir do disco. |
-- | parse | Usada para analisar dados de entrada textual durante uma carga. |
-- | project | Usada para reorganizar colunas e expressões de computação, ou seja, projetar dados. |
Resultado | -- | Executa funções escalares que não envolvem acesso à tabela. |
-- | return | Retorna linhas ao principal ou ao cliente. |
Subplan | -- | Usado para determinadas subconsultas. |
Unique | unique | Elimina duplicidades das consultas SELECT DISTINCT e UNION. |
Window | window | Computa funções agregadas e funções da janela de classificação. Pode operar a partir do disco. |
Operações de rede: | ||
Network (Broadcast) | bcast | Broadcast também é um atributo dos operadores e das etapas de Join Explain. |
Network (Distribute) | dist | Distribui linhas para computar nós para processamento paralelo pelo cluster de data warehouse. |
Network (Send to Leader) | return | Envia resultados de volta ao principal para processamento adicional. |
Operações de DML (operadores que alteram dados): | ||
Insert (using Result) | insert | Insere dados. |
Delete (Scan + Filter) | excluir | Exclui dados. Pode operar a partir do disco. |
Update (Scan + Filter) | delete, insert | Implementado como exclusão e inserção. |
Utilização de EXPLAIN para RLS
Se uma consulta contiver uma tabela sujeita às políticas de segurança no nível da linha (RLS), EXPLAIN exibirá um nó especial do RLS SecureScan. O Amazon Redshift também registra o mesmo tipo de nó na tabela do sistema STL_EXPLAIN. EXPLAIN não revela o predicado RLS que se aplica a dim_tbl. O tipo de nó RLS SecureScan serve como um indicador de que o plano de execução contém operações adicionais que são invisíveis para o usuário atual.
O exemplo a seguir mostra um nó RLS SecureScan.
EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN ------------------------------------------------------------------------ XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") -> *XN* *RLS SecureScan f (cost=0.00..0.14 rows=2 width=4)* Filter: ((k_dim / 10) > 0) -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)
Para permitir a investigação completa dos planos de consulta sujeitos ao RLS, o Amazon Redshift oferece as permissões do sistema EXPLAIN RLS. Os usuários que receberam essa permissão podem inspecionar planos de consulta completos que também incluem predicados RLS.
O exemplo a seguir ilustra uma Seq Scan adicional abaixo do nó RLS SecureScan que também inclui o predicado da política de RLS (k_dim > 1).
EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN --------------------------------------------------------------------------------- XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") *-> XN RLS SecureScan f (cost=0.00..0.14 rows=2 width=4) Filter: ((k_dim / 10) > 0)* -> *XN* *Seq Scan on fact_tbl rls_table (cost=0.00..0.06 rows=5 width=8) Filter: (k_dim > 1)* -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)
Embora a permissão EXPLAIN RLS seja concedida a um usuário, o Amazon Redshift registra o plano de consulta completo, incluindo predicados RLS na tabela do sistema STL_EXPLAIN. As consultas que forem executadas enquanto essa permissão não for concedida serão registradas sem os internos do RLS. Conceder ou remover a permissão EXPLAIN RLS não alterará o que o Amazon Redshift registrou em log no STL_EXPLAIN para consultas anteriores.
Relações do Redshift protegidas entre AWS Lake Formation e RLS
O exemplo a seguir ilustra um nó LF SecureScan, que você pode usar para visualizar relações entre Lake Formation e RLS.
EXPLAIN SELECT * FROM lf_db.public.t_share WHERE a > 1; QUERY PLAN --------------------------------------------------------------- XN LF SecureScan t_share (cost=0.00..0.02 rows=2 width=11) (2 rows)
Exemplos
nota
Para esses exemplos, o resultado da amostra pode variar dependendo da configuração do Amazon Redshift.
O exemplo a seguir retorna o plano de consulta para uma consulta que seleciona EVENTID, EVENTNAME, VENUEID e VENUENAME das tabelas EVENT e VENUE:
explain select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
QUERY PLAN -------------------------------------------------------------------------- XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (5 rows)
O exemplo a seguir retorna o plano de consulta para a mesma consulta com saída "verbose":
explain verbose select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
QUERY PLAN -------------------------------------------------------------------------- {HASHJOIN :startup_cost 2.52 :total_cost 58653620.93 :plan_rows 8712 :plan_width 43 :best_pathkeys <> :dist_info DS_DIST_OUTER :dist_info.dist_keys ( TARGETENTRY { VAR :varno 2 :varattno 1 ... XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (519 rows)
O exemplo a seguir retorna o plano de consulta para uma instrução CREATE TABLE AS (CTAS):
explain create table venue_nonulls as select * from venue where venueseats is not null; QUERY PLAN ----------------------------------------------------------- XN Seq Scan on venue (cost=0.00..2.02 rows=187 width=45) Filter: (venueseats IS NOT NULL) (2 rows)