一、执行原理
TCHouse-X 中,执行 ORDER BY 是一项高开销操作,其过程如下:
1. 局部排序:各计算节点并行对其负责的数据分片进行本地排序。
2. 结果汇聚:排序后的数据流传输至协调器节点(Coordinator)。
3. 全局合并:协调器通过归并算法将各节点的结果集串行合并。
二、语法规范
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` DESC LIMIT 10;
五、避免无效排序
子查询忽略:TCHouse-X 通常会忽略子查询或视图定义内部的 ORDER BY。若要保证最终输出有序,必须将 ORDER BY 应用于最外层的 SELECT。
六、分页
虽然可以使用 LIMIT 与 OFFSET 实现分页,但在处理大表时,由于越往后的页面需要跳过的数据越多,效率会逐渐降低。
— 分页示例SELECT page_title FROM search_content ORDER BY page_title LIMIT 10 OFFSET 20; — 获取第 3 页数据