Noções básicas dos resultados da instrução EXPLAIN do Athena
Esse tópico apresenta uma rápida orientação sobre os termos operacionais usados nos resultados da instrução EXPLAIN
do Athena.
Tipos de saída da instrução EXPLAIN
As saídas da instrução EXPLAIN
podem ser de um destes dois tipos:
-
Plano lógico: mostra o plano lógico que o mecanismo SQL usa para executar uma instrução. A sintaxe para essa opção é
EXPLAIN
ouEXPLAIN (TYPE LOGICAL)
. -
Plano distribuído: mostra um plano de execução em um ambiente distribuído. A saída mostra fragmentos, que são os estágios de processamento. Cada fragmento do plano é processado por um ou mais nós. Os dados podem ser trocados entre os nós que processam os fragmentos. A sintaxe para essa opção é
EXPLAIN (TYPE DISTRIBUTED)
.Na saída de um plano de distribuição, os fragmentos (estágios de processamento) são indicados por
Fragment
number
[fragment_type
], em quenumber
é um número inteiro baseado em zero efragment_type
especifica como os nós executam o fragmento. Os tipos de fragmento, que mostram insights do layout da troca de dados, estão descritos na tabela a seguir.Tipos de fragmento do plano distribuído Tipo de fragmento Descrição SINGLE
O fragmento é executado em um único nó. HASH
O fragmento é executado em um número fixo de nós. Os dados de entrada são distribuídos usando uma função hash. ROUND_ROBIN
O fragmento é executado em um número fixo de nós. Os dados de entrada são distribuídos como “round-robin”. BROADCAST
O fragmento é executado em um número fixo de nós. Os dados de entrada são transmitidos para todos os nós. SOURCE
O fragmento é executado nos nós onde as divisões de entrada são acessadas.
Exchange
Os termos relacionados à troca descrevem como os dados são trocados entre os nós de processamento. As transferências podem ser locais ou remotas.
- LocalExchange [
exchange_type
] -
Transfere os dados localmente nos nós de processamento para estágios diferentes de uma consulta. O valor de
exchange_type
pode ser um dos tipos de troca lógicos ou distribuídos, conforme descrito mais adiante nesta seção. - RemoteExchange [
exchange_type
] -
Transfere os dados entre os nós de processamento para estágios diferentes de uma consulta. O valor de
exchange_type
pode ser um dos tipos de troca lógicos ou distribuídos, conforme descrito mais adiante nesta seção.
Tipos de troca lógicos
Os tipos de troca a seguir descrevem as ações executadas durante a fase de troca de um plano lógico.
-
GATHER
: um único nó de processamento combina a saída de todos os outros nós de processamento. Por exemplo, o último estágio de uma consulta selecionada coleta os resultados de todos os nós e grava esses resultados no Amazon S3. -
REPARTITION
: envia os dados da linha para um operador específico com base no esquema de particionamento que deverá ser aplicado ao próximo operador. -
REPLICATE
: copia os dados da linha para todos os operadores.
Tipos de troca distribuídos
Os tipos de troca a seguir indicam o layout dos dados quando eles são trocados entre os nós em um plano distribuído.
-
HASH
: a troca distribui os dados para vários destinos usando uma função hash. -
SINGLE
: a troca distribui os dados para um único destino.
Verificação
Os termos a seguir descrevem como os dados são verificados durante uma consulta.
- TableScan
-
Verifica os dados de origem de uma tabela do Amazon S3 ou de um conector do Apache Hive e aplica a remoção de partição gerada do predicado de filtro.
- ScanFilter
-
Verifica os dados de origem de uma tabela do Amazon S3 ou de um conector do Hive e aplica a remoção de partição gerada do predicado de filtro e dos outros predicados de filtro não aplicados por meio da remoção de partição.
- ScanFilterProject
-
Primeiramente, verifica os dados de origem de uma tabela do Amazon S3 ou de um conector do Hive e aplica a remoção de partição gerada do predicado de filtro e dos outros predicados de filtro não aplicados por meio da remoção de partição. Na sequência, modifica o layout da memória dos dados de saída para uma nova projeção a fim de melhorar a performance dos estágios posteriores.
Ingressar
Faz a junção dos dados entre duas tabelas. É possível categorizar as junções por tipo de junção e por tipo de distribuição.
Tipos de junção
Os tipos de junção definem como é feita a operação de junção.
CrossJoin: gera o produto cartesiano de duas tabelas unidas.
InnerJoin: seleciona os registros que têm valores correspondentes nas duas tabelas.
LeftJoin: seleciona todos os registros da tabela esquerda e os registros correspondentes da tabela direita. Se não houver nenhuma correspondência, o resultado no lado direito será NULL.
RightJoin: seleciona todos os registros da tabela direita e os registros correspondentes da tabela esquerda. Se não houver nenhuma correspondência, o resultado no lado direito será NULL.
FullJoin: seleciona todos os registros em que há correspondência com os registros da tabela esquerda ou direita. A tabela unida contém todos os registros das duas tabelas e preenche as correspondências ausentes com NULL em um dos lados.
nota
Por motivos de performance, o mecanismo de consulta pode reescrever uma consulta de junção com um tipo de junção diferente para retornar os mesmos resultados. Por exemplo, uma consulta de junção interna com predicado em uma tabela pode ser reescrita como CrossJoin
. Isso leva o predicado à fase de verificação da tabela para que menos dados sejam verificados.
Tipos de distribuição de junção
Os tipos de distribuição definem como os dados são trocados entre os nós de processamento quando a operação de junção é executada.
Particionada: as tabelas tanto esquerda quanto direita são particionadas por hash em todos os nós de processamento. A distribuição particionada consome menos memória em cada nó. A distribuição particionada pode ser muito mais lenta do que as junções replicadas. As junções particionadas são ideais para unir duas tabelas grandes.
Replicada: uma tabela é particionada por hash em todos os nós de processamento, e a outra tabela é replicada para todos os nós de processamento para executar a operação de junção. A distribuição replicada pode ser muito mais rápida do que as junções particionadas, mas consome mais memória em cada nó de processamento. Se a tabela replicada for muito grande, o nó de processamento poderá receber um erro de memória insuficiente. As junções replicadas são ideais quando uma das tabelas unidas é pequena.