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_statsGROUP BY user_idORDER BY `sum` DESCLIMIT 10;
避免无效排序
子查询忽略:TCHouse-X 通常会忽略子查询或视图定义内部的
ORDER BY。若要保证最终输出有序,必须将 ORDER BY 应用于最外层的 SELECT。分页
虽然可以使用
LIMIT 与 OFFSET 实现分页,但在处理大表时,由于越往后的页面需要跳过的数据越多,效率会逐渐降低。-- 分页示例SELECT page_title FROM search_contentORDER BY page_titleLIMIT 10 OFFSET 20; -- 获取第 3 页数据