ORDER BY 子句

最近更新时间:2026-05-06 16:28:13

我的收藏
ORDER BY 子句用于根据一个或多个列的值对 SELECT 语句的结果集进行升序(ASC)或降序(DESC)排列。

执行原理

TCHouse-X 中,执行 ORDER BY 是一项高开销操作,其过程如下:
1. 局部排序:各计算节点并行对其负责的数据分片进行本地排序。
2. 结果汇聚:排序后的数据流传输至协调器节点(Coordinator)。
3. 全局合并:协调器通过归并算法将各节点的结果集串行合并。
注意:
资源消耗:排序相比普通查询更消耗内存。
响应延迟:普通查询可以在匹配到行时即时返回,而 ORDER BY 必须等待所有节点处理完成并由协调器完成全局排序后,才能开始向客户端返回首行数据。

语法规范

ORDER BY col_ref [, col_ref ...] [ASC | DESC] [NULLS FIRST | NULLS LAST]

col_ref ::= column_name | integer_literal
列引用方式:
名称引用:最常用的方式,如 ORDER BY price
位置索引(列号):可以使用整数常量。例如 ORDER BY 1 表示按 SELECT 列表中的第一列排序。
说明:
列号必须是显式列出的列,不能在 SELECT * 语句中使用。必须是数字常量,不可使用复杂的表达式或字符串。

排序行为

升序与降序

ASC(默认):从小到大排列。
DESC:从大到小排列。

性能优化

ORDER BY 与 LIMIT 结合使用

原理:如果包含 LIMIT 10,每个计算节点仅需将本地排序后的前 10 条数据发送给协调器。Coordinator 只需在极小的中间结果集中选取前 10 条,极大地降低了网络传输压力和内存需求。
-- 执行高效的 Top 10 查询
SELECT user_id, SUM(page_views) `sum`
FROM web_stats
GROUP BY user_id
ORDER BY `sum` DESC
LIMIT 10;

避免无效排序

子查询忽略:TCHouse-X 通常会忽略子查询或视图定义内部的 ORDER BY。若要保证最终输出有序,必须将 ORDER BY 应用于最外层的 SELECT

分页

虽然可以使用 LIMITOFFSET 实现分页,但在处理大表时,由于越往后的页面需要跳过的数据越多,效率会逐渐降低。
-- 分页示例
SELECT page_title FROM search_content
ORDER BY page_title
LIMIT 10 OFFSET 20; -- 获取第 3 页数据