Operator terdistribusi dieksekusi di beberapa server, tidak seperti operator leaf, unary, biner, atau n-ary.
Operator berikut adalah operator terdistribusi:
- Gabungan terdistribusi
- Penerapan terdistribusi
- Gabungan penggabungan terdistribusi
- Gabungan hash siaran push
Skema database
Kueri dan rencana eksekusi di halaman ini didasarkan pada skema database berikut:
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);
Anda dapat menggunakan pernyataan Bahasa Manipulasi Data (DML) berikut untuk menambahkan data ke tabel ini:
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");
Operator gabungan terdistribusi adalah operator primitif yang darinya cross apply terdistribusi dan outer apply terdistribusi berasal.
Operator terdistribusi muncul dalam rencana eksekusi dengan varian gabungan terdistribusi di atas satu atau beberapa varian gabungan terdistribusi lokal. Varian gabungan terdistribusi melakukan distribusi jarak jauh sub-paket.
Varian penggabungan terdistribusi lokal berada di atas setiap pemindaian yang dilakukan untuk kueri. Varian penggabungan terdistribusi lokal memastikan eksekusi kueri yang stabil saat terjadi mulai ulang untuk batas pemisahan yang berubah secara dinamis. Meskipun operator ini disembunyikan dari rencana visual, operator ini selalu ada.
Jika memungkinkan, varian gabungan terdistribusi menggunakan predikat pemisahan untuk pruning pemisahan. Penyusutan pemisahan berarti server jarak jauh menjalankan sub-paket hanya pada pemisahan yang memenuhi predikat, sehingga meningkatkan latensi dan performa kueri.
Gabungan terdistribusi
Operator gabungan terdistribusi secara konseptual membagi satu atau beberapa tabel menjadi beberapa pemisahan, mengevaluasi subkueri secara terpisah pada setiap pemisahan, lalu menggabungkan semua hasil.
Kueri berikut menunjukkan operator ini:
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 |
+-----------------+-----------*/
Rencana eksekusi akan muncul sebagai berikut:

Operator gabungan terdistribusi mengirimkan sub-paket ke server jarak jauh, yang melakukan
pemindaian tabel di seluruh pemisahan yang memenuhi
predikat WHERE s.SingerId = 2 AND s.SongGenre = 'ROCK' kueri.
Operator serialize result
menghitung nilai SongName dan SongGenre
dari baris yang ditampilkan oleh pemindaian tabel. Operator gabungan terdistribusi
kemudian menampilkan hasil gabungan dari server jarak jauh sebagai hasil
kueri SQL.
Properti dan statistik eksekusi
Properti operator menjelaskan sifat yang digunakan saat operator dijalankan. Statistik eksekusi adalah nilai yang dikumpulkan selama eksekusi kueri untuk membantu Anda menilai performa operator.
Operator Gabungan terdistribusi memiliki statistik eksekusi berbeda tambahan.Properti
| Nama | Deskripsi |
|---|---|
| Metode eksekusi | Dalam Eksekusi baris, operator memproses satu baris dalam satu waktu. Dalam Eksekusi batch, operator memproses batch baris sekaligus. |
Statistik eksekusi
| Nama | Deskripsi |
|---|---|
| Eksekusi paralel lokal | Jumlah subkueri yang dieksekusi secara paralel. |
| Panggilan jarak jauh | Jumlah subkueri jarak jauh yang dieksekusi. |
| Latensi | Waktu berlalu dari semua eksekusi yang dilakukan di operator. |
| Latensi kumulatif | Total waktu operator saat ini dan turunannya. |
| Waktu CPU | Jumlah waktu CPU yang dihabiskan untuk mengeksekusi operator. |
| Waktu CPU kumulatif | Total waktu CPU yang dihabiskan untuk mengeksekusi operator dan turunannya. |
| Waktu eksekusi | Total waktu yang diperlukan untuk menjalankan kueri dan memproses hasil. |
| Baris yang ditampilkan | Jumlah baris yang dihasilkan oleh operator ini |
| Jumlah eksekusi | Frekuensi operator dieksekusi. Beberapa eksekusi dapat berjalan secara paralel. |
Secara umum, eksekusi dilakukan secara paralel, tidak seperti eksekusi cross apply. Oleh karena itu, angka latensi pada operator terdistribusi bersifat kumulatif, tidak seperti kebanyakan operator yang melaporkan seberapa besar latensi yang ditambahkan operator tersebut. Jumlah eksekusi dalam gabungan terdistribusi didasarkan pada batas pemisahan tabel, yang pada gilirannya bergantung pada ukuran dan beban data, dan berpotensi menyertakan petunjuk pernyataan use_additional_parallelism. Pendekatan statistik ini berlaku untuk semua operator terdistribusi.
Penerapan terdistribusi
Operator penerapan terdistribusi (DA) memperluas operator gabungan penerapan dengan menjalankan di beberapa server. Sisi input mengelompokkan baris ke dalam batch (tidak seperti operator penerapan silang reguler, yang hanya bertindak pada satu baris input dalam satu waktu). Sisi peta DA adalah serangkaian operator gabungan penerapan biasa yang dijalankan di server jarak jauh. Gabungan penerapan terdistribusi mendukung metode penerapan yang sama seperti gabungan penerapan.
Properti dan statistik eksekusi
Properti operator menjelaskan sifat yang digunakan saat operator dijalankan. Statistik eksekusi adalah nilai yang dikumpulkan selama eksekusi kueri untuk membantu Anda menilai performa operator.
Operator Distributed apply memiliki statistik eksekusi tambahan yang berbeda.Properti
| Nama | Deskripsi |
|---|---|
| Metode eksekusi | Dalam Eksekusi baris, operator memproses satu baris dalam satu waktu. Dalam Eksekusi batch, operator memproses batch baris sekaligus. |
Statistik eksekusi
| Nama | Deskripsi |
|---|---|
| Eksekusi paralel lokal | Jumlah subkueri yang dieksekusi secara paralel. |
| Panggilan jarak jauh | Jumlah subkueri jarak jauh yang dieksekusi. |
| Jumlah batch | Batch adalah kumpulan baris dinamis yang diproses pada saat yang bersamaan. Bagian ini menampilkan jumlah batch yang dikirim penerapan silang terdistribusi dari sisi input ke sisi peta. |
| Latensi | Waktu berlalu dari semua eksekusi yang dilakukan di operator. |
| Latensi kumulatif | Total waktu operator saat ini dan turunannya. |
| Waktu CPU | Jumlah waktu CPU yang dihabiskan untuk mengeksekusi operator. |
| Waktu CPU kumulatif | Total waktu CPU yang dihabiskan untuk mengeksekusi operator dan turunannya. |
| Waktu eksekusi | Total waktu yang diperlukan untuk menjalankan kueri dan memproses hasil. |
| Baris yang ditampilkan | Jumlah baris yang dihasilkan oleh operator ini |
| Jumlah eksekusi | Frekuensi operator dieksekusi. Beberapa eksekusi dapat berjalan secara paralel. |
Penerapan silang terdistribusi
Kueri berikut menunjukkan operator ini:
SELECT albumtitle
FROM songs
JOIN albums
ON albums.albumid = songs.albumid;
/*-----------------------+
| AlbumTitle |
+-----------------------+
| Green |
| Nothing To Do With Me |
| Play |
| Total Junk |
| Green |
+-----------------------*/
Rencana eksekusi akan muncul sebagai berikut:

Input DCA berisi pemindaian indeks pada indeks
SongsBySingerAlbumSongNameDesc yang mengelompokkan baris AlbumId. Sisi peta untuk DCA adalah cross apply standar, dengan input berupa batch baris, dan sisi peta berupa pemindaian indeks pada indeks AlbumsByAlbumTitle, yang tunduk pada predikat AlbumId dalam baris input yang cocok dengan kunci AlbumId dalam indeks AlbumsByAlbumTitle. Pemetaan menampilkan SongName untuk nilai
SingerId dalam baris input yang dikelompokkan.
Untuk meringkas proses DCA dalam contoh ini, input DCA adalah baris yang dikelompokkan dari tabel Albums, dan output DCA adalah penerapan baris ini ke peta pemindaian indeks.
Penerapan luar terdistribusi
Distributed outer apply adalah DA dengan semantik left outer join. Lihat outer apply untuk mengetahui detail semantiknya.
Kueri berikut menunjukkan operator ini:
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 | |
+----------+-------------*/
Rencana eksekusi akan muncul sebagai berikut:

Penerapan semi terdistribusi
Distributed semi apply adalah DA dengan semantik semi-join. Lihat semi apply untuk mengetahui detail semantiknya.
Penerapan anti-semi terdistribusi
Penerapan anti-semi terdistribusi adalah DA dengan semantik gabungan anti-semi. Lihat anti-semi apply untuk mengetahui detail semantiknya.
Gabungan penggabungan terdistribusi
Operator gabungan penggabungan terdistribusi mendistribusikan kueri di beberapa server jarak jauh. Kemudian, hasil kueri digabungkan untuk menghasilkan hasil yang diurutkan, yang dikenal sebagai penggabungan terurut terdistribusi.
Gabungan penggabungan terdistribusi menjalankan langkah-langkah berikut:
Server root mengirimkan subkueri ke setiap server jarak jauh yang menghosting split data yang dikueri. Subkueri menyertakan petunjuk bahwa hasil diurutkan dalam urutan tertentu.
Setiap server jarak jauh menjalankan subkueri pada pemisahannya, lalu mengirimkan kembali hasilnya dalam urutan yang diminta.
Server root menggabungkan subkueri yang diurutkan untuk menghasilkan hasil yang diurutkan sepenuhnya.
Gabungan penggabungan terdistribusi diaktifkan secara default untuk Spanner Versi 3 dan yang lebih baru.
Properti dan statistik eksekusi
Properti operator menjelaskan sifat yang digunakan saat operator dijalankan. Statistik eksekusi adalah nilai yang dikumpulkan selama eksekusi kueri untuk membantu Anda menilai performa operator.
Operator Distributed apply memiliki statistik eksekusi tambahan yang berbeda.Properti
| Nama | Deskripsi |
|---|---|
| Metode eksekusi | Dalam Eksekusi baris, operator memproses satu baris dalam satu waktu. Dalam Eksekusi batch, operator memproses batch baris sekaligus. |
Statistik eksekusi
| Nama | Deskripsi |
|---|---|
| Eksekusi paralel lokal | Jumlah subkueri yang dieksekusi secara paralel. |
| Panggilan jarak jauh | Jumlah subkueri jarak jauh yang dieksekusi. |
| Jumlah batch | Batch adalah kumpulan baris dinamis yang diproses pada saat yang bersamaan. Bagian ini menampilkan jumlah batch yang dikirim penerapan silang terdistribusi dari sisi input ke sisi peta. |
| Latensi | Waktu berlalu dari semua eksekusi yang dilakukan di operator. |
| Latensi kumulatif | Total waktu operator saat ini dan turunannya. |
| Waktu CPU | Jumlah waktu CPU yang dihabiskan untuk mengeksekusi operator. |
| Waktu CPU kumulatif | Total waktu CPU yang dihabiskan untuk mengeksekusi operator dan turunannya. |
| Waktu eksekusi | Total waktu yang diperlukan untuk menjalankan kueri dan memproses hasil. |
| Baris yang ditampilkan | Jumlah baris yang dihasilkan oleh operator ini |
| Jumlah eksekusi | Frekuensi operator dieksekusi. Beberapa eksekusi dapat berjalan secara paralel. |
Bergabung ke hash siaran push
Operator push broadcast hash join adalah implementasi gabungan SQL berbasis hash-join terdistribusi. Operator gabungan hash siaran push membaca baris dari sisi input untuk membuat batch data. Operator menyiarkan batch tersebut ke semua server yang berisi data sisi peta. Di server tujuan tempat batch data diterima, operator membuat hash gabungan menggunakan batch sebagai data sisi pembuatan dan memindai data lokal sebagai sisi pemeriksaan hash gabungan.
Push broadcast hash join memiliki keunggulan berikut:
- Jika tabel build kecil, tabel tersebut dapat dikirim ke semua pemisahan sisi peta.
- Tabel samping peta dapat dipindai, dengan atau tanpa filter residual. Hal ini terjadi saat kunci gabungan tidak sama dengan kunci utama tabel peta.
Push broadcast hash join tidak dipilih secara otomatis oleh pengoptimal. Untuk menggunakan
operator ini, tetapkan metode gabungan ke PUSH_BROADCAST_HASH_JOIN pada
petunjuk kueri, seperti yang ditunjukkan dalam contoh berikut:
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 |
+-----------------------+--------------------------*/
Rencana eksekusi akan muncul sebagai berikut:

Input untuk gabungan hash siaran Push adalah indeks AlbumsByAlbumTitle.
Operator menserialisasi input tersebut menjadi batch data. Operator mengirimkan batch tersebut ke semua
pemisahan lokal indeks SongsBySingerAlbumSongNameDesc, tempat operator mendeserialisasi batch
dan membangunnya menjadi tabel hash. Kemudian, tabel hash menggunakan data indeks lokal sebagai probe yang menampilkan kecocokan yang dihasilkan.
Hasil kecocokan juga dapat difilter berdasarkan kondisi residual sebelum ditampilkan. (Contoh kondisi residual muncul dalam gabungan non-persamaan).
Properti dan statistik eksekusi
Properti operator menjelaskan sifat yang digunakan saat operator dijalankan. Statistik eksekusi adalah nilai yang dikumpulkan selama eksekusi kueri untuk membantu Anda menilai performa operator.
Operator Distributed apply memiliki statistik eksekusi tambahan yang berbeda.Properti
| Nama | Deskripsi |
|---|---|
| Metode eksekusi | Dalam Eksekusi baris, operator memproses satu baris dalam satu waktu. Dalam Eksekusi batch, operator memproses batch baris sekaligus. |
Statistik eksekusi
| Nama | Deskripsi |
|---|---|
| Eksekusi paralel lokal | Jumlah subkueri yang dieksekusi secara paralel. |
| Panggilan jarak jauh | Jumlah subkueri jarak jauh yang dieksekusi. |
| Jumlah batch | Batch adalah kumpulan baris dinamis yang diproses pada saat yang bersamaan. Bagian ini menampilkan jumlah batch yang dikirim penerapan silang terdistribusi dari sisi input ke sisi peta. |
| Latensi | Waktu berlalu dari semua eksekusi yang dilakukan di operator. |
| Latensi kumulatif | Total waktu operator saat ini dan turunannya. |
| Waktu CPU | Jumlah waktu CPU yang dihabiskan untuk mengeksekusi operator. |
| Waktu CPU kumulatif | Total waktu CPU yang dihabiskan untuk mengeksekusi operator dan turunannya. |
| Waktu eksekusi | Total waktu yang diperlukan untuk menjalankan kueri dan memproses hasil. |
| Baris yang ditampilkan | Jumlah baris yang dihasilkan oleh operator ini |
| Jumlah eksekusi | Frekuensi operator dieksekusi. Beberapa eksekusi dapat berjalan secara paralel. |