叶运算符没有子运算符。叶运算符的类型有以下几种:
数据库架构
此页面上的查询和执行计划基于以下数据库架构:
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);
您可以使用以下数据操纵语言 (DML) 语句向这些表中添加数据:
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");
解除数组嵌套
“解除数组嵌套”运算符可将输入数组展平为多行元素。每个结果行最多包含两列:数组中的值,以及数组中从零开始计数的位置(可选)。
以下查询演示了此运算符:
SELECT a, b FROM UNNEST([1,2,3]) a WITH OFFSET b;
/*---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
+---+---*/
该查询会在列 a 中展平数组 [1,2,3],并在列 b 中显示数组位置。
执行计划如下所示:

属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
生成关系
生成关系运算符返回零个或更多的行。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
单元关系
单元关系返回一行。它是生成关系运算符的一个特例。
以下查询演示了此运算符:
SELECT 1 + 2 AS Result;
/*--------+
| Result |
+--------+
| 3 |
+--------*/
执行计划如下所示:

属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
空关系
空关系不返回任何行。它是生成关系运算符的一个特例。
以下查询演示了此运算符:
SELECT *
FROM albums
LIMIT 0
/*
No result
*/
执行计划如下所示:

属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
扫描
扫描运算符扫描行的来源并返回这些行。以下是扫描运算符的类型:
- 表扫描:扫描表。
- 索引扫描:扫描索引。
- 批量扫描:扫描发生在由其他关系运算符创建的中间表上(例如由分布式交叉应用创建的表)。
Spanner 会尽可能在扫描中对键应用谓词。当 Spanner 应用谓词时,扫描执行效率会更高,因为扫描不需要读取整个表或索引。谓词在执行计划中显示为:
- 可搜索条件:如果 Spanner 可以确定要在表中访问的特定行,则可搜索条件适用。通常情况下,当过滤器位于主键的前缀上时会发生这种情况。例如,如果主键由
Col1和Col2组成,则包含Col1或者包含Col1和Col2的显式值的WHERE子句是可以搜索的。在这种情况下,Spanner 仅在键范围内读取数据。
如果查询必须查找表中的所有行,则会发生全表扫描,并在执行计划中显示为 full scan: true。
以下查询演示了此运算符:
SELECT s.lastname
FROM singers@{FORCE_INDEX=SingersByFirstLastName} as s
WHERE s.firstname = 'Catalina';
/*----------+
| LastName |
+----------+
| Smith |
+----------*/
执行计划段如下所示:

在该执行计划中,顶层分布式联合运算符将子计划发送给远程服务器。每个子计划都有一个序列化结果运算符和一个索引扫描运算符。谓词 Key Predicate: FirstName = 'Catalina' 将扫描范围限制为索引 SingersByFirstLastname 中 FirstName 等于 Catalina 的行。索引扫描将输出返回给序列化结果运算符。
Spanner 将扫描与过滤扫描紧密结合,并将它们视为一个运算符。如果没有查找条件,运算符会显示为“全扫描”。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
扫描运算符具有其他不同的属性和执行统计信息。属性
| 名称 | 说明 |
|---|---|
| 扫描方法 | 可以是 Row、Batch 或 Automatic。在行执行中,运算符一次处理一行。在批处理执行中,运算符一次处理一批行。在自动执行中,运算符会使用 Row 方法开始扫描,但可以在需要时更改为 Batch。 |
| 搜索条件 | 用于高效查找表的基于主键的谓词。此属性表示无需扫描整个表即可生成所需的行集。此属性仅适用于 Table Scans 和 Index Scans。 |
| 变量分配 | 从表中读取的列的列表。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 扫描的行数 | 扫描期间读取的行数。 |
| 查找次数 | 相应扫描运算符执行的查找或寻道次数。 |
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
过滤器扫描
过滤器扫描运算符始终位于表或索引扫描之上。它与扫描配合使用以减少从数据库读取的行数,并且生成的扫描通常比使用过滤器更快。Spanner 会在特定条件下应用过滤器扫描:
- 残余条件:Spanner 可以计算扫描以限制读取的数据量的任何其他条件。
以下查询演示了此运算符:
SELECT lastname
FROM singers
WHERE singerid = 1
/*----------+
| LastName |
+----------+
| Richards |
+----------*/
执行计划如下所示:

属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤扫描运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 剩余条件 | 在读取行后应用的谓词。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |