Noções básicas sobre os resultados da instrução EXPLAIN do Athena - Amazon Athena

Noções básicas sobre os 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 ou EXPLAIN (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 que number é um número inteiro baseado em zero e fragment_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.