Um operador folha não tem filhos. Os tipos de operadores folha são:
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");
Array unnest
Usando um operador array unnest é possível nivelar uma matriz de entrada em linhas de elementos. Em cada linha resultante há até duas colunas: o valor da matriz e a posição baseada em zero opcional na matriz.
A consulta a seguir demonstra esse operador:
SELECT a, b FROM UNNEST([1,2,3]) a WITH OFFSET b;
/*---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
+---+---*/
A consulta nivela a matriz [1,2,3] na coluna a e mostra a posição da matriz na coluna b.
O plano de execução aparece da seguinte forma:

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. |
Generate relation
Um operador generate relation retorna zero ou mais 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.
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. |
Unit relation
Unit relation retorna uma linha. É um caso especial do operador generate relation.
A consulta a seguir demonstra esse operador:
SELECT 1 + 2 AS Result;
/*--------+
| Result |
+--------+
| 3 |
+--------*/
O plano de execução aparece da seguinte forma:

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. |
Empty relation
Empty relation não retorna nenhuma linha. É um caso especial do operador generate relation.
A consulta a seguir demonstra esse operador:
SELECT *
FROM albums
LIMIT 0
/*
No result
*/
O plano de execução aparece da seguinte forma:

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. |
Verificar
Um operador scan verifica uma fonte de linhas e as retorna. Estes são os tipos de operadores de varredura:
- Verificação de tabela: verifica uma tabela.
- Verificação de índice: verifica um índice.
- Batch scan: as verificações ocorrem em tabelas intermediárias criadas por outros operadores relacionais. Por exemplo, uma tabela criada por um operador distributed cross apply.
Sempre que possível, o Spanner aplica predicados em chaves como parte de uma verificação. As verificações são executadas de modo mais eficiente quando o Spanner aplica predicados, porque não é necessário que a tabela ou índice inteiros sejam lidos pela verificação. Os predicados aparecem no plano de execução como:
- Condição pesquisável: a condição pesquisável se aplica se o Spanner puder determinar uma linha específica para acessar na tabela. Em geral, isso acontece quando o filtro está em um prefixo da chave primária. Por exemplo, se a chave primária consistir em
Col1eCol2, uma cláusulaWHEREque inclua valores explícitos paraCol1ouCol1eCol2será pesquisável. Nesse caso, o Spanner lê dados somente dentro do intervalo de chaves.
Se uma consulta precisar pesquisar todas as linhas de uma tabela, uma verificação completa será realizada, o que aparece no plano de execução como full scan: true.
A consulta a seguir demonstra esse operador:
SELECT s.lastname
FROM singers@{FORCE_INDEX=SingersByFirstLastName} as s
WHERE s.firstname = 'Catalina';
/*----------+
| LastName |
+----------+
| Smith |
+----------*/
O segmento do plano de execução aparece da seguinte maneira:

No plano de execução, com o operador distributed union de nível superior, são enviados subplanos a servidores remotos. Em cada subplano há um operador serialize result e um operador index scan. O predicado Key Predicate: FirstName = 'Catalina' restringe a verificação às linhas no índice SingersByFirstLastname que têm FirstName igual a Catalina. A verificação de índice retorna a saída para o operador de resultado de serialização.
O Spanner acopla verificações com Verificação de filtro e as considera um único operador. Se não houver uma condição de busca, o operador vai aparecer como "Verificação completa".
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 Scan tem outras propriedades distintas e estatísticas de execução.Propriedades
| Nome | Descrição |
|---|---|
| Método de verificação | Pode ser Linha, Lote ou Automático. 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. Na execução automática, o operador começa a fazer a verificação usando o método Row, mas pode mudar para Batch quando necessário. |
| Condição de busca | Um predicado na chave primária usado para realizar pesquisas eficientes de uma tabela. Essa propriedade significa que não é necessário verificar a tabela inteira para produzir o conjunto de linhas desejado. Essa propriedade só é aplicável a Table Scans e Index Scans. |
| Atribuição de variável | Lista das colunas lidas da tabela. |
| 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 |
|---|---|
| Linhas verificadas | O número de linhas lidas durante a verificação. |
| Contagem de buscas | O número de pesquisas ou buscas realizadas por este operador de verificaçã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. |
Filter scan
Um operador filter scan sempre aparece acima de uma verificação de tabela ou índice. Ele opera com a verificação para reduzir o número de linhas lidas no banco de dados, e a verificação resultante é normalmente mais rápida do que com um filtro. O Spanner aplica a verificação de filtro em certas condições:
- Condição residual: qualquer outra condição em que o Spanner possa avaliar a verificação para limitar a quantidade de dados lidos.
A consulta a seguir demonstra esse operador:
SELECT lastname
FROM singers
WHERE singerid = 1
/*----------+
| LastName |
+----------+
| Richards |
+----------*/
O plano de execução aparece da seguinte forma:

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 scan tem outras propriedades distintas.Propriedades
| Nome | Descrição |
|---|---|
| Condição residual | Um predicado aplicado depois que a linha é lida. |
| 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. |