一元运算符具有单个关系子项。
以下运算符为一元运算符:
- 聚合
- 应用变更
- 创建批次
- 计算
- 计算结构体
- DataBlockToRowAdapter
- 过滤
- 限额
- 本地分块联合
- 随机 ID 分配
- RowToDataBlockAdapter
- 序列化结果
- 排序
- TVF
- 联合输入
数据库架构
此页面上的查询和执行计划基于以下数据库架构:
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");
汇总
聚合运算符可实现 GROUP BY SQL 语句和聚合函数(如 COUNT)。聚合运算符的输入在逻辑上划分为按键列排列的组(如果没有 GROUP BY,则划分到一个组中)。对于每个组,计算零个或多个聚合。
以下查询演示了此运算符:
SELECT s.singerid,
Avg(s.duration) AS average,
Count(*) AS count
FROM songs AS s
GROUP BY singerid;
/*----------+---------+-------+
| SingerId | average | count |
+----------+---------+-------+
| 3 | 278 | 1 |
| 2 | 225.875 | 8 |
+----------+---------+-------*/
该查询按 SingerId 进行分组,并执行 AVG 聚合和 COUNT 聚合。
执行计划段如下所示:

聚合运算符可以基于数据流或基于哈希。上面的执行计划展示了一个基于数据流的聚合。基于数据流的聚合从预排序的输入(如果存在 GROUP BY)中读取数据并计算组,其过程没有阻塞。基于哈希的聚合会构建哈希表,以同时维护多个输入行的增量聚合。基于数据流的聚合比基于哈希的聚合速度更快,且使用的内存更少,但要求对输入进行排序(通过键列或二级索引)。
对于分布式场景,聚合运算符会拆分为局部-全局对。每个远程服务器对其输入行执行局部聚合,然后将其结果返回到根服务器。根服务器再执行全局聚合。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
应用变更
应用变更运算符将来自数据操纵语言 (DML) 语句的变更应用到表中。它是针对 DML 语句的查询计划中的顶级运算符。
以下查询演示了此运算符:
DELETE FROM singers
WHERE firstname = 'Alice';
/*
4 rows deleted This statement deleted 4 rows and did not return any rows.
*/
执行计划如下所示:

属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
创建批次
创建批次运算符将其输入行批量化为一个序列。创建批次操作通常作为分布式交叉应用操作的一部分。在批处理期间,输入行可以重新排序。每次执行分批运算符时被分批的输入行数是可变的。
您可以参阅分布式交叉应用运算符,查看执行计划中创建批次运算符的示例。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
计算
计算运算符通过读取其输入行并添加一个或多个使用标量表达式计算的附加列来生成输出。您可以参阅全部联合运算符,查看执行计划中计算运算符的示例。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
计算结构体
计算结构体运算符为包含每个输入列的字段的结构体创建变量。
以下查询演示了此运算符:
SELECT FirstName,
ARRAY(SELECT AS STRUCT song.SongName, song.SongGenre
FROM Songs AS song
WHERE song.SingerId = singer.SingerId)
FROM singers AS singer
WHERE singer.SingerId = 3;
/*-----------+------------------------------------------------------+
| FirstName | Unspecified |
+-----------+------------------------------------------------------+
| Alice | [["Not About The Guitar","BLUES"]] |
+-----------+------------------------------------------------------*/
执行计划如下所示:

在该执行计划中,数组子查询运算符从计算结构体运算符接收输入。计算结构体运算符根据 Songs 表中的 SongName 和 SongGenre 列创建结构体。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
属性
| 名称 | 说明 |
|---|---|
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
过滤
过滤器运算符从其输入中读取所有行,并在每个行上应用标量谓词,然后仅返回满足谓词的行。
以下查询演示了此运算符:
SELECT s.lastname
FROM (SELECT s.lastname
FROM singers AS s
LIMIT 3) s
WHERE s.lastname LIKE 'Rich%';
/*----------+
| LastName |
+----------+
| Richards |
+----------*/
执行计划如下所示:

Spanner 将姓氏以 Rich 开头的歌手的谓词实现为过滤器。过滤器从索引扫描接收输入,并输出 LastName 以 Rich 开头的行。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
限制
限制运算符限制返回的行数。可选的 OFFSET 参数指定要返回的起始行。在分布式场景中,限制运算符会拆分为局部-全局对。每个远程服务器为其输出行应用局部限制,然后将其结果返回给根服务器。根服务器聚合远程服务器发送过来的行,然后应用全局限制。
以下查询演示了此运算符:
SELECT s.songname
FROM songs AS s
LIMIT 3;
/*----------------------+
| SongName |
+----------------------+
| Not About The Guitar |
| The Second Time |
| Starting Again |
+----------------------*/
执行计划如下所示:

局部限制是针对每个远程服务器的限制。根服务器聚合来自远程服务器的行,然后应用全局限制。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
随机 ID 分配
随机 ID 分配运算符通过读取其输入行并向每行添加随机号码来生成输出。它与 Filter 或 Sort 运算符搭配使用,以实现采样方法。支持的采样方法有 Bernoulli 和 Reservoir。
例如,以下查询使用采样率为 10% 的 Bernoulli 采样。
SELECT s.songname
FROM songs AS s TABLESAMPLE bernoulli (10 PERCENT);
/*----------------+
| SongName |
+----------------+
| Starting Again |
+----------------*/
由于结果是一个样本,因此即使查询相同,每次运行查询的结果也可能有所不同。

在该执行计划中,Random Id Assign 运算符从分布式联合运算符接收其输入,后者从索引扫描接收输入。该运算符返回包含随机 ID 的行,Filter 运算符随后对随机 ID 应用标量谓词,并返回大约 10% 的行。
以下示例使用采样率为 2 行的 Reservoir
采样。
SELECT s.songname
FROM songs AS s TABLESAMPLE reservoir (2 rows);
/*------------------------+
| SongName |
+------------------------+
| I Knew You Were Magic |
| The Second Time |
+------------------------*/
由于结果是一个样本,因此即使查询相同,每次运行查询的结果也可能有所不同。
以下为执行计划:

在该执行计划中,Random Id Assign 运算符从分布式联合运算符接收其输入,后者从索引扫描接收输入。该运算符返回包含随机 ID 的行,Sort 运算符随后对随机 ID 应用排列顺序,并应用采样率为 2 行的 LIMIT。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
本地分块联合
本地分块联合运算符会查找存储在本地服务器上的表分块,对每个分块运行子查询,然后创建一个合并所有结果的联合。
本地分块联合会出现在扫描布置表的执行计划中。布置可以增加表中的分块数量,从而更高效地按批次扫描分块(根据其物理存储位置)。
例如,假设 Singers 表使用布置键对歌手数据进行分区:
CREATE TABLE Singers (
SingerId INT64 NOT NULL,
SingerName STRING(MAX) NOT NULL,
...
Location STRING(MAX) NOT NULL PLACEMENT KEY
) PRIMARY KEY (SingerId);
现在,请考虑以下查询:
SELECT BirthDate FROM Singers;
以下为执行计划:

分布式联合会向以物理方式一起存储在同一服务器中的每个分块批次发送一个子查询。在每个服务器上,本地分块联合会查找存储 Singers 数据的分块,对每个分块执行子查询,并返回合并后的结果。这样一来,分布式联合和本地分块联合便可以协同工作,高效扫描 Singers 表。如果不使用本地分块联合,分布式联合会对每个分块发送一个 RPC(而不是对每个分块批次发送),从而会在每个批次包含多个分块时导致冗余的 RPC 往返。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
DataBlockToRowAdapter
Spanner 查询优化器会自动在采用不同执行方法的一对运算符之间插入 DataBlockToRowAdapter 运算符。其输入是使用面向批处理的执行方法的运算符,其输出则会馈送到以面向行的执行方法执行的运算符。如需了解详情,请参阅优化查询执行。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
RowToDataBlockAdapter
Spanner 查询优化器会自动在采用不同执行方法的一对运算符之间插入 RowToDataBlockAdapter 运算符。其输入是使用面向行的执行方法的运算符,其输出则会馈送到以面向批处理的执行方法执行的运算符。如需了解详情,请参阅优化查询执行。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
序列化结果
序列化结果运算符是计算结构体运算符的一种特殊情况,它将查询的最终结果的每一行序列化,然后返回给客户端。
以下查询演示了此运算符:
SELECT array
(
select as struct so.songname,
so.songgenre
FROM songs AS so
WHERE so.singerid = s.singerid)
FROM singers AS s;
/*------------------------------------------------------------------+
| Unspecified |
+------------------------------------------------------------------+
| [] |
| [[Let's Get Back Together, COUNTRY], [Starting Again, ROCK]] |
| [["Not About The Guitar", "BLUES"]] |
| [] |
| [] |
+------------------------------------------------------------------*/
执行计划如下所示:

序列化结果运算符会为 Singers 表的每一行创建一个结果,其中包含歌手歌曲的 SongName 和 SongGenre 对的数组。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
排序
排序运算符读取输入行,按列对其排序,然后返回排序后的结果。
以下查询演示了此运算符:
SELECT s.songgenre
FROM songs AS s
ORDER BY songgenre;
/*--------------------------+
| SongGenre |
+--------------------------+
| BLUES |
| BLUES |
| BLUES |
| BLUES |
| CLASSICAL |
| COUNTRY |
| ROCK |
| ROCK |
| ROCK |
+--------------------------*/
执行计划如下所示:

在该执行计划中,排序运算符从分布式联合运算符接收其输入行,对输入行进行排序,然后将排序后的行返回给序列化结果运算符。
为了限制返回的行数,排序运算符可以有选择地使用 LIMIT 和 OFFSET 参数。对于分布式场景,包含 LIMIT 或 OFFSET 运算符的排序运算符会拆分为局部-全局对。每个远程服务器都会为其输入行应用排列顺序和局部限制或偏移,然后将其结果返回给根服务器。根服务器聚合远程服务器发送过来的行,并进行排序,然后应用全局限制/偏移。
以下查询演示了此运算符:
SELECT s.songgenre
FROM songs AS s
ORDER BY songgenre
LIMIT 3;
/*--------------------------+
| SongGenre |
+--------------------------+
| BLUES |
| BLUES |
| BLUES |
+--------------------------*/
执行计划如下所示:

该执行计划显示远程服务器的局部限制和根服务器的全局限制。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
TVF
表值函数运算符通过读取其输入行并应用指定函数来生成输出。该函数可能会实现映射,并返回与输入相同的行数。它也可以是返回更多行的生成器或返回更少行的过滤器。
以下查询演示了此运算符:
SELECT genre,
songname
FROM ml.predict(model genreclassifier, TABLE songs)
/*-----------------------+--------------------------+
| Genre | SongName |
+-----------------------+--------------------------+
| Country | Not About The Guitar |
| Rock | The Second Time |
| Pop | Starting Again |
| Pop | Nothing Is The Same |
| Country | Let's Get Back Together |
| Pop | I Knew You Were Magic |
| Electronic | Blue |
| Rock | 42 |
| Rock | Fight Story |
+-----------------------+--------------------------*/
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |
联合输入
联合输入运算符将结果返回给全部联合运算符。您可以参阅全部联合运算符,查看执行计划中联合输入运算符的示例。
属性和执行统计信息
运算符的属性描述了在执行运算符时使用的特征。执行统计信息是在查询执行期间收集的值,可帮助您评估运算符的性能。
过滤运算符具有其他不同的属性。属性
| 名称 | 说明 |
|---|---|
| 条件 | 应用于每个输入行的谓词。如果为 true,则将相应行传递给下一个运算符;如果为 false,则舍弃相应行。 |
| 执行方法 | 在行执行中,运算符一次处理一行。 在批处理执行中,运算符一次处理一批行。 |
执行统计信息
| 名称 | 说明 |
|---|---|
| 延迟时间 | 运算符中所有执行操作的耗时。 |
| 累计延迟时间 | 当前运算符及其后代的总时间。 |
| CPU 时间 | 执行运算符所花费的 CPU 时间总和。 |
| 累计 CPU 时间 | 执行相应运算符及其后代所花费的总 CPU 时间。 |
| 执行时间 | 运行查询和处理结果所花费的总时间。 |
| 返回的行数 | 相应运算符输出的行数 |
| 执行任务数量 | 相应运算符的执行次数。某些执行任务可以并行运行。 |