Subkueri skalar adalah sub-ekspresi SQL yang merupakan bagian dari ekspresi skalar. Spanner akan berusaha menghapus subkueri skalar jika memungkinkan. Namun, dalam skenario tertentu, rencana secara eksplisit berisi subkueri skalar.
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");
Kueri berikut menunjukkan operator ekspresi skalar:
SELECT firstname,
IF(firstname = 'Alice', (SELECT Count(*)
FROM songs
WHERE duration > 300), 0)
FROM singers;
/*-----------+----+
| FirstName | |
+-----------+----+
| Alice | 1 |
| Catalina | 0 |
| David | 0 |
| Lea | 0 |
| Marc | 0 |
+-----------+----*/
Rencana eksekusi akan muncul sebagai berikut:

Rencana eksekusi menampilkan subkueri skalar sebagai Subkueri Skalar di atas operator agregat.
Spanner terkadang mengonversi subkueri skalar menjadi operator lain seperti gabungan atau penerapan silang, untuk meningkatkan performa.
Kueri berikut menunjukkan operator ini:
SELECT *
FROM songs
WHERE duration = (SELECT Max(duration)
FROM songs);
/*----------+---------+---------+---------------------+----------+-----------+
| SingerId | AlbumId | TrackId | SongName | Duration | SongGenre |
+----------+---------+---------+---------------------+----------+-----------+
| 2 | 1 | 6 | Nothing Is The Same | 303 | BLUES |
+----------+---------+---------+---------------------+----------+-----------*/
Rencana eksekusi akan muncul sebagai berikut:

Rencana eksekusi mengecualikan subkueri skalar karena Spanner mengonversi subkueri skalar menjadi cross apply.
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.
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 |
|---|---|
| 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. |