Operatori distribuiti

Gli operatori distribuiti vengono eseguiti su più server, a differenza degli operatori foglia, unari, binari o n-ari.

I seguenti operatori sono operatori distribuiti:

Schema del database

Le query e i piani di esecuzione in questa pagina si basano sul seguente schema del database:

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);

Puoi utilizzare le seguenti istruzioni DML (Data Manipulation Language) per aggiungere dati a queste tabelle:

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");

L'operatore Distributed Union è l'operatore primitivo da cui derivano Distributed Cross Apply e Distributed Outer Apply.

Gli operatori distribuiti vengono visualizzati nei piani di esecuzione con una variante di unione distribuita sopra una o più varianti di unione distribuita locale. Una variante di un'operazione Union distribuita esegue la distribuzione remota dei sottopiani.

Una variante di unione distribuita locale si trova in cima a ciascuna delle scansioni eseguite per la query. Le varianti dell'operazione Union distribuita locale garantiscono l'esecuzione stabile delle query quando si verificano riavvii perconfini della suddivisionee che cambiano dinamicamente. Sebbene questo operatore sia nascosto nel piano visivo, è sempre presente.

Quando possibile, una variante di unione distribuita utilizza un predicato di suddivisione per il taglio della suddivisione. Il pruning delle suddivisioni indica che i server remoti eseguono i sottopiani solo sulle suddivisioni che soddisfano il predicato, migliorando la latenza e le prestazioni delle query.

Distributed union

Un operatore distributed union divide concettualmente una o più tabelle in più split, valuta in remoto una sottoquery in modo indipendente su ogni split e poi unisce tutti i risultati.

La seguente query mostra questo operatore:

SELECT s.songname,
       s.songgenre
FROM   songs AS s
WHERE  s.singerid = 2
       AND s.songgenre = 'ROCK';

/*-----------------+-----------+
 | SongName        | SongGenre |
 +-----------------+-----------+
 | Starting Again  | ROCK      |
 | The Second Time | ROCK      |
 | Fight Story     | ROCK      |
 +-----------------+-----------*/

Il piano di esecuzione viene visualizzato nel seguente modo:

Piano di esecuzione dell&#39;operatore di unione distribuita

L'operatore di unione distribuita invia i sottopiani ai server remoti, che eseguono una scansione della tabella tra le suddivisioni che soddisfano il predicato WHERE s.SingerId = 2 AND s.SongGenre = 'ROCK' della query. Un operatore serialize result calcola i valori SongName e SongGenre dalle righe restituite dalle scansioni delle tabelle. L'operatore di unione distribuita restituisce quindi i risultati combinati dei server remoti come risultati della query SQL.

Proprietà e statistiche di esecuzione

Una proprietà di un operatore descrive una caratteristica utilizzata quando l'operatore viene eseguito. Una statistica di esecuzione è un valore raccolto durante l'esecuzione della query per aiutarti a valutare le prestazioni dell'operatore.

L'operatore Distributed union ha statistiche di esecuzione distinte aggiuntive.

Proprietà

Nome Descrizione
Metodo di esecuzione Nell'esecuzione per riga, l'operatore elabora una riga alla volta. Nell'esecuzione batch, l'operatore elabora un batch di righe contemporaneamente.

Statistiche di esecuzione

Nome Descrizione
Esecuzioni parallele locali Il numero di sottoquery eseguite in parallelo.
Chiamate remote Il numero di sottoquery remote eseguite.
Latenza Tempo trascorso di tutte le esecuzioni eseguite nell'operatore.
Latenza cumulativa Il tempo totale dell'operatore corrente e dei relativi discendenti.
Tempo CPU Somma del tempo di CPU dedicato all'esecuzione dell'operatore.
Tempo di CPU cumulativo Il tempo di CPU totale dedicato all'esecuzione dell'operatore e dei relativi discendenti.
Tempo di esecuzione Il tempo totale impiegato per eseguire la query ed elaborare i risultati.
Righe restituite Il numero di righe generate da questo operatore
Numero di esecuzioni Il numero di volte in cui l'operatore è stato eseguito. Alcune esecuzioni possono essere eseguite in parallelo.

In genere, le esecuzioni sono parallele, a differenza delle esecuzioni cross apply. Per questo motivo, i numeri di latenza degli operatori distribuiti sono cumulativi, a differenza della maggior parte degli operatori, che indicano la latenza aggiunta dall'operatore. Il numero di esecuzioni in un'unione distribuita si basa suiconfini della suddivisionee della tabella, che a loro volta dipendono dalle dimensioni e dal caricamento dei dati e possono includere il suggerimento dell'istruzione use_additional_parallelism. Questo approccio alle statistiche si applica a tutti gli operatori distribuiti.

Applicazione distribuita

Un operatore distributed apply (DA) estende l'operatore apply join eseguendolo su più server. Il lato di input raggruppa le righe in batch (a differenza di un normale operatore Cross Apply, che agisce su una sola riga di input alla volta). Il lato della mappa DA è un insieme di operatori di join di applicazione semplice che vengono eseguiti su server remoti. Un join distributed apply supporta gli stessi metodi di applicazione del join apply.

Proprietà e statistiche di esecuzione

Una proprietà di un operatore descrive una caratteristica utilizzata quando l'operatore viene eseguito. Una statistica di esecuzione è un valore raccolto durante l'esecuzione della query per aiutarti a valutare le prestazioni dell'operatore.

L'operatore Applicazione distribuita ha statistiche di esecuzione distinte aggiuntive.

Proprietà

Nome Descrizione
Metodo di esecuzione Nell'esecuzione per riga, l'operatore elabora una riga alla volta. Nell'esecuzione batch, l'operatore elabora un batch di righe contemporaneamente.

Statistiche di esecuzione

Nome Descrizione
Esecuzioni parallele locali Il numero di sottoquery eseguite in parallelo.
Chiamate remote Il numero di sottoquery remote eseguite.
Numero di batch Un batch è una raccolta dinamica di righe elaborate contemporaneamente. Mostra il numero di batch di un cross-apply distribuito inviati dall'input al lato della mappa.
Latenza Tempo trascorso di tutte le esecuzioni eseguite nell'operatore.
Latenza cumulativa Il tempo totale dell'operatore corrente e dei relativi discendenti.
Tempo CPU Somma del tempo di CPU dedicato all'esecuzione dell'operatore.
Tempo di CPU cumulativo Il tempo di CPU totale dedicato all'esecuzione dell'operatore e dei relativi discendenti.
Tempo di esecuzione Il tempo totale impiegato per eseguire la query ed elaborare i risultati.
Righe restituite Il numero di righe generate da questo operatore
Numero di esecuzioni Il numero di volte in cui l'operatore è stato eseguito. Alcune esecuzioni possono essere eseguite in parallelo.

Distributed Cross Apply

La seguente query mostra questo operatore:

SELECT albumtitle
FROM   songs
       JOIN albums
         ON albums.albumid = songs.albumid;

/*-----------------------+
 | AlbumTitle            |
 +-----------------------+
 | Green                 |
 | Nothing To Do With Me |
 | Play                  |
 | Total Junk            |
 | Green                 |
 +-----------------------*/

Il piano di esecuzione viene visualizzato nel seguente modo:

Piano di esecuzione dell&#39;operatore cross apply distribuito

L'input DCA contiene una scansione dell'indice SongsBySingerAlbumSongNameDesc che raggruppa le righe di AlbumId. La parte della mappa per DCA è un'applicazione incrociata standard, in cui l'input è un batch di righe e la parte della mappa è una scansione dell'indice AlbumsByAlbumTitle, soggetta al predicato di AlbumId nella riga di input corrispondente alla chiave AlbumId nell'indice AlbumsByAlbumTitle. La mappatura restituisce SongName per i valori SingerId nelle righe di input batch.

Per riassumere la procedura DCA per questo esempio, l'input del DCA sono le righe in batch della tabella Albums e l'output del DCA è l'applicazione di queste righe alla mappa della scansione dell'indice.

Applica esterno distribuito

Un operatore Distributed Outer Apply è un DA con semantica left outer join. Per informazioni dettagliate sulla semantica, consulta outer apply.

La seguente query mostra questo operatore:

SELECT lastname,
       concertdate
FROM   singers LEFT OUTER join@{JOIN_TYPE=APPLY_JOIN} concerts
ON singers.singerid=concerts.singerid;

/*----------+-------------+
 | LastName | ConcertDate |
 +----------+-------------+
 | Trentor  | 2014-02-18  |
 | Smith    | 2011-09-03  |
 | Smith    | 2010-06-06  |
 | Lomond   | 2005-04-30  |
 | Martin   | 2015-11-04  |
 | Richards |             |
 +----------+-------------*/

Il piano di esecuzione viene visualizzato nel seguente modo:

Piano di esecuzione dell&#39;operatore di applicazione esterna distribuito

Distributed semi apply

Un Distributed semi apply è un DA con semantica di semi-join. Per informazioni sulla semantica, consulta semi apply.

Distributed anti-semi apply

Un Distributed Anti-Semi Apply è un operatore Distributed Apply con semantica anti-semi join. Per informazioni sulla semantica, consulta anti-semi apply.

Unione di unione distribuita

L'operatore distributed merge union distribuisce una query su più server remoti. Poi combina i risultati della query per produrre un risultato ordinato, noto come ordinamento di unione distribuito.

Un'unione di merge distribuita esegue i seguenti passaggi:

  1. Il server radice invia una sottoquery a ogni server remoto che ospita una suddivisione dei dati sottoposti a query. La sottoquery include istruzioni che i risultati vengono ordinati in un ordine specifico.

  2. Ogni server remoto esegue la sottoquery sulla propria suddivisione, quindi invia i risultati nell'ordine richiesto.

  3. Il server radice unisce la sottoquery ordinata per produrre un risultato completamente ordinato.

L'unione di merge distribuita è abilitata per impostazione predefinita per Spanner versione 3 e successive.

Proprietà e statistiche di esecuzione

Una proprietà di un operatore descrive una caratteristica utilizzata quando l'operatore viene eseguito. Una statistica di esecuzione è un valore raccolto durante l'esecuzione della query per aiutarti a valutare le prestazioni dell'operatore.

L'operatore Applicazione distribuita ha statistiche di esecuzione distinte aggiuntive.

Proprietà

Nome Descrizione
Metodo di esecuzione Nell'esecuzione per riga, l'operatore elabora una riga alla volta. Nell'esecuzione batch, l'operatore elabora un batch di righe contemporaneamente.

Statistiche di esecuzione

Nome Descrizione
Esecuzioni parallele locali Il numero di sottoquery eseguite in parallelo.
Chiamate remote Il numero di sottoquery remote eseguite.
Numero di batch Un batch è una raccolta dinamica di righe elaborate contemporaneamente. Mostra il numero di batch di un cross-apply distribuito inviati dall'input al lato della mappa.
Latenza Tempo trascorso di tutte le esecuzioni eseguite nell'operatore.
Latenza cumulativa Il tempo totale dell'operatore corrente e dei relativi discendenti.
Tempo CPU Somma del tempo di CPU dedicato all'esecuzione dell'operatore.
Tempo di CPU cumulativo Il tempo di CPU totale dedicato all'esecuzione dell'operatore e dei relativi discendenti.
Tempo di esecuzione Il tempo totale impiegato per eseguire la query ed elaborare i risultati.
Righe restituite Il numero di righe generate da questo operatore
Numero di esecuzioni Il numero di volte in cui l'operatore è stato eseguito. Alcune esecuzioni possono essere eseguite in parallelo.

Push broadcast hash join

Un operatore push broadcast hash join è un'implementazione distribuita basata su hash join dei join SQL. L'operatore di join hash push broadcast legge le righe dal lato di input per costruire un batch di dati. L'operatore trasmette il batch a tutti i server contenenti dati lato mappa. Sui server di destinazione in cui viene ricevuto il batch di dati, l'operatore crea un hash join utilizzando il batch come dati del lato di build ed esegue la scansione dei dati locali come lato di probe dell'hash join.

Push broadcast hash join presenta i seguenti vantaggi:

  • Se la tabella di build è piccola, può essere inviata a tutte le suddivisioni laterali della mappa.
  • La tabella laterale della mappa può essere scansionata, con o senza filtri residui. Ciò si verifica quando le chiavi di join non sono uguali alle chiavi primarie della tabella della mappa.

Push broadcast hash join non viene selezionato automaticamente dall'ottimizzatore. Per utilizzare questo operatore, imposta il metodo di unione su PUSH_BROADCAST_HASH_JOIN nel suggerimento per la query, come mostrato nell'esempio seguente:

SELECT a.albumtitle,
       s.songname
FROM   albums AS a join@{join_method=push_broadcast_hash_join} songs AS s
ON     a.singerid = s.singerid
AND    a.albumid = s.albumid;

/*-----------------------+--------------------------+
 | AlbumTitle            | SongName                 |
 +-----------------------+--------------------------+
 | Green                 | The Second Time          |
 | Green                 | Starting Again           |
 | Green                 | Nothing Is The Same      |
 | Green                 | Let's Get Back Together  |
 | Green                 | I Knew You Were Magic    |
 | Green                 | Blue                     |
 | Green                 | 42                       |
 | Terrified             | Fight Story              |
 | Nothing To Do With Me | Not About The Guitar     |
 +-----------------------+--------------------------*/

Il piano di esecuzione viene visualizzato nel seguente modo:

Piano di esecuzione dell&#39;operatore Push broadcast hash join

L'input dell'unione hash della trasmissione push è l'indice AlbumsByAlbumTitle. L'operatore serializza l'input in un batch di dati. L'operatore invia il batch a tutte le suddivisioni locali dell'indice SongsBySingerAlbumSongNameDesc, dove lo deserializza e lo inserisce in una tabella hash. La tabella hash utilizza quindi i dati dell'indice locale come probe che restituisce le corrispondenze risultanti.

Le corrispondenze risultanti potrebbero anche essere filtrate in base a una condizione residua prima di essere restituite. Un esempio di dove compaiono le condizioni residue è nei join di non uguaglianza.

Proprietà e statistiche di esecuzione

Una proprietà di un operatore descrive una caratteristica utilizzata quando l'operatore viene eseguito. Una statistica di esecuzione è un valore raccolto durante l'esecuzione della query per aiutarti a valutare le prestazioni dell'operatore.

L'operatore Applicazione distribuita ha statistiche di esecuzione distinte aggiuntive.

Proprietà

Nome Descrizione
Metodo di esecuzione Nell'esecuzione per riga, l'operatore elabora una riga alla volta. Nell'esecuzione batch, l'operatore elabora un batch di righe contemporaneamente.

Statistiche di esecuzione

Nome Descrizione
Esecuzioni parallele locali Il numero di sottoquery eseguite in parallelo.
Chiamate remote Il numero di sottoquery remote eseguite.
Numero di batch Un batch è una raccolta dinamica di righe elaborate contemporaneamente. Mostra il numero di batch di un cross-apply distribuito inviati dall'input al lato della mappa.
Latenza Tempo trascorso di tutte le esecuzioni eseguite nell'operatore.
Latenza cumulativa Il tempo totale dell'operatore corrente e dei relativi discendenti.
Tempo CPU Somma del tempo di CPU dedicato all'esecuzione dell'operatore.
Tempo di CPU cumulativo Il tempo di CPU totale dedicato all'esecuzione dell'operatore e dei relativi discendenti.
Tempo di esecuzione Il tempo totale impiegato per eseguire la query ed elaborare i risultati.
Righe restituite Il numero di righe generate da questo operatore
Numero di esecuzioni Il numero di volte in cui l'operatore è stato eseguito. Alcune esecuzioni possono essere eseguite in parallelo.