Operadores unary

Um operador unário tem um único filho relacional.

Os seguintes operadores são unários:

Database schema

As consultas e os planos de execução dessa página se baseiam no esquema de banco de dados abaixo:

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
  BirthDate  DATE
) PRIMARY KEY(SingerId);

CREATE INDEX SingersByFirstLastName ON Singers(FirstName, LastName);

CREATE TABLE Albums (
  SingerId        INT64 NOT NULL,
  AlbumId         INT64 NOT NULL,
  AlbumTitle      STRING(MAX),
  MarketingBudget INT64
) PRIMARY KEY(SingerId, AlbumId),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget);

CREATE TABLE Songs (
  SingerId  INT64 NOT NULL,
  AlbumId   INT64 NOT NULL,
  TrackId   INT64 NOT NULL,
  SongName  STRING(MAX),
  Duration  INT64,
  SongGenre STRING(25)
) PRIMARY KEY(SingerId, AlbumId, TrackId),
  INTERLEAVE IN PARENT Albums ON DELETE CASCADE;

CREATE INDEX SongsBySingerAlbumSongNameDesc ON Songs(SingerId, AlbumId, SongName DESC), INTERLEAVE IN Albums;

CREATE INDEX SongsBySongName ON Songs(SongName);

CREATE TABLE Concerts (
  VenueId      INT64 NOT NULL,
  SingerId     INT64 NOT NULL,
  ConcertDate  DATE NOT NULL,
  BeginTime    TIMESTAMP,
  EndTime      TIMESTAMP,
  TicketPrices ARRAY<INT64>
) PRIMARY KEY(VenueId, SingerId, ConcertDate);

É possível usar as seguintes instruções da linguagem de manipulação de dados (DML) para adicionar dados a estas tabelas:

INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate)
VALUES (1, "Marc", "Richards", "1970-09-03"),
       (2, "Catalina", "Smith", "1990-08-17"),
       (3, "Alice", "Trentor", "1991-10-02"),
       (4, "Lea", "Martin", "1991-11-09"),
       (5, "David", "Lomond", "1977-01-29");

INSERT INTO Albums (SingerId, AlbumId, AlbumTitle)
VALUES (1, 1, "Total Junk"),
       (1, 2, "Go, Go, Go"),
       (2, 1, "Green"),
       (2, 2, "Forever Hold Your Peace"),
       (2, 3, "Terrified"),
       (3, 1, "Nothing To Do With Me"),
       (4, 1, "Play");

INSERT INTO Songs (SingerId, AlbumId, TrackId, SongName, Duration, SongGenre)
VALUES (2, 1, 1, "Let's Get Back Together", 182, "COUNTRY"),
       (2, 1, 2, "Starting Again", 156, "ROCK"),
       (2, 1, 3, "I Knew You Were Magic", 294, "BLUES"),
       (2, 1, 4, "42", 185, "CLASSICAL"),
       (2, 1, 5, "Blue", 238, "BLUES"),
       (2, 1, 6, "Nothing Is The Same", 303, "BLUES"),
       (2, 1, 7, "The Second Time", 255, "ROCK"),
       (2, 3, 1, "Fight Story", 194, "ROCK"),
       (3, 1, 1, "Not About The Guitar", 278, "BLUES");

Agregar

Um operador aggregate implementa instruções SQL GROUP BY e funções de agregação (como COUNT). A entrada de um operador de agregação é particionada logicamente em grupos organizados em colunas de chave (ou em um único grupo se GROUP BY não estiver presente). Para cada grupo, zero ou mais agregados são calculados.

A consulta a seguir demonstra esse operador:

SELECT s.singerid,
       Avg(s.duration) AS average,
       Count(*)        AS count
FROM   songs AS s
GROUP  BY singerid;

/*----------+---------+-------+
 | SingerId | average | count |
 +----------+---------+-------+
 |        3 | 278     |     1 |
 |        2 | 225.875 |     8 |
 +----------+---------+-------*/

A consulta é agrupada por SingerId e executa uma agregação AVG e uma agregação COUNT.

O segmento do plano de execução aparece da seguinte maneira:

Plano de execução do operador de agregação

Os operadores aggregate podem ser baseados em stream ou baseados em hash. O plano de execução anterior mostra um agregado baseado em stream. Os agregados baseados em stream leem a entrada pré-classificada (se GROUP BY estiver presente) e computam o grupo sem bloqueio. Os agregados baseados em hash criam tabelas de hash para manter agregados incrementais de várias linhas de entrada simultaneamente. Os agregados baseados em stream são mais rápidos e usam menos memória do que os agregados baseados em hash, mas exigem que a entrada seja classificada (por colunas de chave ou índices secundários).

Em cenários distribuídos, o operador de agregação é dividido em um par local-global. A agregação local é executada individualmente pelos servidores remotos nas respectivas linhas de entrada e, em seguida, os resultados são retornados ao servidor raiz. No servidor raiz é executada a agregação global.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

Propriedades

Nome Descrição
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Apply mutations

Um operador apply mutations aplica as mutações de uma instrução de linguagem de manipulação de dados (DML) à tabela. Ele é o operador principal em um plano de consulta para uma instrução DML.

A consulta a seguir demonstra esse operador:

DELETE FROM singers
WHERE  firstname = 'Alice';

/*
4 rows deleted  This statement deleted 4 rows and did not return any rows.
*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador apply mutations

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

Propriedades

Nome Descrição
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Criar lote

Um operador create batch reúne as linhas de entrada em sequência. Uma operação create batch geralmente ocorre como parte de uma operação distributed cross apply. É possível reordenar as linhas de entrada durante o processamento de lotes. O número de linhas de entrada que são agrupadas em cada execução do operador de lote varia.

Consulte o operador distributed cross apply para ver um exemplo de operador create batch em um plano de execução.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

Propriedades

Nome Descrição
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Computação

A saída de um operador compute é produzida com a leitura das linhas de entrada e a adição de uma ou mais colunas extras que são computadas usando expressões escalares. Consulte o operador union all para ver um exemplo do operador compute em um plano de execução.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

Propriedades

Nome Descrição
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Compute struct

Com um operador compute struct é possível criar uma variável para uma estrutura contendo campos para cada uma das colunas de entrada.

A consulta a seguir demonstra esse operador:

SELECT FirstName,
       ARRAY(SELECT AS STRUCT song.SongName, song.SongGenre
             FROM Songs AS song
             WHERE song.SingerId = singer.SingerId)
FROM singers AS singer
WHERE singer.SingerId = 3;

/*-----------+------------------------------------------------------+
 | FirstName | Unspecified                                          |
 +-----------+------------------------------------------------------+
 | Alice     | [["Not About The Guitar","BLUES"]]                   |
 +-----------+------------------------------------------------------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador compute struct

No plano de execução, a entrada de um operador compute struct é recebida pelo operador array subquery. O operador compute struct cria uma estrutura das colunas SongName e SongGenre na tabela Songs.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

Propriedades

Nome Descrição
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Filtro

Com um operador filter, todas as linhas da entrada são lidas, um predicado escalar é aplicado a cada linha e apenas as linhas que satisfazem ao predicado são retornadas.

A consulta a seguir demonstra esse operador:

SELECT s.lastname
FROM   (SELECT s.lastname
        FROM   singers AS s
        LIMIT  3) s
WHERE  s.lastname LIKE 'Rich%';

/*----------+
 | LastName |
 +----------+
 | Richards |
 +----------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador de filtro

O Spanner implementa o predicado para cantores com sobrenome começado por Rich como um filtro. O filtro recebe entrada de uma verificação de índice e gera linhas em que LastName começa com Rich.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Limite

Um operador limit restringe o número de linhas retornadas. Um parâmetro OFFSET opcional especifica a linha inicial a ser retornada. Em cenários distribuídos, o operador "limit" é dividido em um par local-global. Cada servidor remoto aplica o limite local às linhas de saída e retorna os resultados ao servidor raiz. O servidor raiz agrega as linhas enviadas pelos servidores remotos e aplica o limite global.

A consulta a seguir demonstra esse operador:

SELECT s.songname
FROM   songs AS s
LIMIT  3;

/*----------------------+
 | SongName             |
 +----------------------+
 | Not About The Guitar |
 | The Second Time      |
 | Starting Again       |
 +----------------------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador LIMIT

O limite local é aquele de cada servidor remoto. As linhas dos servidores remotos são agregadas pelo servidor raiz e, em seguida, o limite global é aplicado.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Atribuição de ID aleatório

Um operador aleatório de atribuição de ID produz saída lendo as linhas de entrada e adicionando um número aleatório a cada linha. Ele funciona com um operador Filter ou Sort para conseguir métodos de amostragem. Os métodos compatíveis de amostragem são Bernoullie Reservoir.

Por exemplo, a consulta a seguir usa a amostragem Bernoulli com uma taxa de amostragem de 10%.

SELECT s.songname
FROM   songs AS s TABLESAMPLE bernoulli (10 PERCENT);

/*----------------+
 | SongName       |
 +----------------+
 | Starting Again |
 +----------------*/

Como o resultado é uma amostra, ele pode variar toda vez que a consulta for executada, mesmo que a consulta seja a mesma.

Plano de execução do operador de amostra de Bernoulli

Neste plano de execução, o operador Random Id Assign recebe sua entrada de um operador de união distribuída, que recebe sua entrada a partir de um index scan. O operador retorna as linhas com códigos aleatórios, e o operador Filter aplica um predicado escalar aos códigos aleatórios e retorna aproximadamente 10% das linhas.

O exemplo a seguir usa Reservoir

com uma taxa de amostragem de 2 linhas.

SELECT s.songname
FROM   songs AS s TABLESAMPLE reservoir (2 rows);

/*------------------------+
 | SongName               |
 +------------------------+
 | I Knew You Were Magic  |
 | The Second Time        |
 +------------------------*/

Como o resultado é uma amostra, ele pode variar toda vez que a consulta for executada, mesmo que a consulta seja a mesma.

Este é o plano de execução:

Plano de execução do operador de amostra de reservatório

Neste plano de execução, o operador Random Id Assign recebe sua entrada de um operador de união distribuída, que recebe sua entrada a partir de um index scan. O operador retorna as linhas com IDs aleatórios, e o operador Sort aplica a ordem de classificação nos IDs aleatórios e aplica LIMIT com duas linhas.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

União de divisão local

Um operador local split union encontra divisões de tabela armazenadas no servidor local, executa uma subconsulta em cada divisão e cria uma união que combina todos os resultados.

Uma união de divisão local aparece em planos de execução que verificam uma tabela de posicionamento. As posições podem aumentar o número de divisões em uma tabela, tornando mais eficiente a verificação em lotes com base nos locais de armazenamento físico.

Por exemplo, suponha que a tabela Singers use uma chave de posição para particionar dados de cantores:

CREATE TABLE Singers (
    SingerId INT64 NOT NULL,
    SingerName STRING(MAX) NOT NULL,
    ...
    Location STRING(MAX) NOT NULL PLACEMENT KEY
) PRIMARY KEY (SingerId);

Agora, considere esta consulta:

SELECT BirthDate FROM Singers;

Este é o plano de execução:

Plano de execução do operador de união de divisão local

A união distribuída envia uma subconsulta para cada lote de divisões armazenadas fisicamente juntas no mesmo servidor. Em cada servidor, a união de divisão local encontra divisões que armazenam dados de Singers, executa a subconsulta em cada divisão e retorna os resultados combinados. Dessa forma, a união distribuída e a união de divisão local trabalham juntas para verificar com eficiência a tabela Singers. Sem uma união de divisão local, a união distribuída enviaria uma RPC por divisão em vez de por lote de divisão, resultando em viagens de ida e volta redundantes de RPC quando há mais de uma divisão por lote.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

DataBlockToRowAdapter

O otimizador de consultas do Spanner insere automaticamente um operador DataBlockToRowAdapter entre um par de operadores que funcionam usando métodos de execução diferentes. A entrada é um operador que usa o método de execução orientado a lotes, e a saída é transmitida para um operador que executa no método de execução orientado a linhas. Para mais informações, consulte Otimizar a execução de consultas.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

RowToDataBlockAdapter

O otimizador de consultas do Spanner insere automaticamente um operador RowToDataBlockAdapter entre um par de operadores que funcionam usando métodos de execução diferentes. A entrada é um operador que usa o método de execução orientado a linhas, e a saída é transmitida para um operador que executa no método de execução orientado a lotes. Para mais informações, consulte Otimizar a execução de consultas.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Serialize result

Um operador serialize result é um caso especial do operador "compute struct" que serializa cada linha do resultado final da consulta para retorno ao cliente.

A consulta a seguir demonstra esse operador:

SELECT array
  (
    select as struct so.songname,
            so.songgenre
    FROM   songs AS so
    WHERE  so.singerid = s.singerid)
FROM  singers AS s;

/*------------------------------------------------------------------+
 | Unspecified                                                      |
 +------------------------------------------------------------------+
 | []                                                               |
 | [[Let's Get Back Together, COUNTRY], [Starting Again, ROCK]]     |
 | [["Not About The Guitar", "BLUES"]]                              |
 | []                                                               |
 | []                                                               |
 +------------------------------------------------------------------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador serialize result

O operador serialize result cria um resultado que contém, para cada linha da tabela Singers, uma matriz de pares SongName e SongGenre para as músicas de um cantor.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Classificar

Um operador sort lê as linhas de entrada, as ordena por colunas e, em seguida, retorna os resultados classificados.

A consulta a seguir demonstra esse operador:

SELECT s.songgenre
FROM   songs AS s
ORDER  BY songgenre;

/*--------------------------+
 | SongGenre                |
 +--------------------------+
 | BLUES                    |
 | BLUES                    |
 | BLUES                    |
 | BLUES                    |
 | CLASSICAL                |
 | COUNTRY                  |
 | ROCK                     |
 | ROCK                     |
 | ROCK                     |
 +--------------------------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador de classificação

Neste plano de execução, as linhas de entrada de um operador "sort" são recebidas de um distributed union e classificadas. Em seguida, elas são retornadas a um operador serialize result.

Para restringir o número de linhas retornadas, um operador "sort" pode opcionalmente ter os parâmetros LIMIT e OFFSET. Em cenários distribuídos, um operador "sort" com um operador LIMIT ou OFFSET é dividido em um par local-global. Cada servidor remoto aplica a ordem de classificação e o limite ou deslocamento local para as linhas de entrada e, em seguida, retorna os resultados ao servidor raiz. O servidor raiz agrega as linhas enviadas pelos servidores remotos, as classifica e, em seguida, aplica o limite/deslocamento global.

A consulta a seguir demonstra esse operador:

SELECT s.songgenre
FROM   songs AS s
ORDER  BY songgenre
LIMIT  3;

/*--------------------------+
 | SongGenre                |
 +--------------------------+
 | BLUES                    |
 | BLUES                    |
 | BLUES                    |
 +--------------------------*/

O plano de execução aparece da seguinte forma:

Plano de execução do operador sort com limit

O plano de execução mostra o limite local dos servidores remotos e o limite global do servidor raiz.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

TVF

Um operador de função com valor de tabela produz saída lendo as linhas de entrada e aplicando a função especificada. A função pode implementar o mapeamento e retornar o mesmo número de linhas que a entrada. Também pode ser um gerador que retorna mais linhas ou um filtro que retorna menos linhas.

A consulta a seguir demonstra esse operador:

SELECT genre,
       songname
FROM   ml.predict(model genreclassifier, TABLE songs)

/*-----------------------+--------------------------+
 | Genre                 | SongName                 |
 +-----------------------+--------------------------+
 | Country               | Not About The Guitar     |
 | Rock                  | The Second Time          |
 | Pop                   | Starting Again           |
 | Pop                   | Nothing Is The Same      |
 | Country               | Let's Get Back Together  |
 | Pop                   | I Knew You Were Magic    |
 | Electronic            | Blue                     |
 | Rock                  | 42                       |
 | Rock                  | Fight Story              |
 +-----------------------+--------------------------*/

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.

Union input

Um operador union input retorna resultados para o operador union all. Consulte o operador union all para ver um exemplo do operador "union input" em um plano de execução.

Propriedades e estatísticas de execução

Uma propriedade de um operador descreve uma característica usada quando o operador é executado. Uma estatística de execução é um valor coletado durante a execução da consulta para ajudar você a avaliar a performance do operador.

O operador Filter tem outras propriedades distintas.

Propriedades

Nome Descrição
Condição Um predicado aplicado a cada linha de entrada. Quando "true", a linha é transmitida para o próximo operador. Quando "false", a linha é descartada.
Método de execução Na execução de linha, o operador processa uma linha por vez. Na execução em lote, o operador processa um lote de linhas de uma só vez.

Estatísticas de execução

Nome Descrição
Latência Tempo decorrido de todas as execuções feitas no operador.
Latência cumulativa O tempo total do operador atual e dos descendentes dele.
Tempo de CPU Soma do tempo de CPU gasto na execução do operador.
Tempo de CPU cumulativo O tempo total de CPU gasto na execução do operador e dos descendentes dele.
Tempo de execução O tempo total gasto para executar a consulta e processar os resultados.
Linhas retornadas O número de linhas geradas por esse operador.
Número de execuções O número de vezes que o operador foi executado. Algumas execuções podem ser realizadas em paralelo.