LIMIT 子句用于指定 SELECT 查询返回的最大行数。在分布式查询处理中,预先设定结果集上限能显著优化协调节点的内存分配,提升整体吞吐量。语法规范
LIMIT constant_integer_literal
核心限制:
类型限制:当前版本仅支持非负整数字面量(如 10)。
不支持表达式:无法使用算术运算(2+2)、函数(LENGTH())、类型转换(CAST())或科学计数法(1e6)。
不支持子查询:参数必须是静态确定的。
风格限制:不支持 MySQL 风格的 LIMIT start, n。
场景 | 错误写法 (Unsupported) | 正确写法 (Supported) |
表达式 | LIMIT 10 + 5 | LIMIT 15 |
函数 | LIMIT LENGTH('abc') | LIMIT 3 |
偏移量 | LIMIT 2, 10 | LIMIT 10 OFFSET 2 |
执行逻辑
在 TCHouse-X 中,
LIMIT 不仅仅是过滤数据,它具有显著的性能加速作用:本地限制:每个计算节点在本地扫描时,达到
LIMIT 数量后即停止扫描。减少网络开销:仅传输必要的行数到协调节点,大幅降低节点间的通信延迟。
内存保护:防止由于
WHERE 条件过宽导致的海量数据涌入内存。典型使用场景
Top-N / Bottom-N 查询:必须配合
ORDER BY 使用,例如获取“评分最高的前 10 件商品”。语法验证:使用
LIMIT 0。系统会解析并生成执行计划,但不会执行实际的 I/O 或返回数据,适合测试 SQL 合法性。数据采样:不带
ORDER BY 使用 LIMIT。由于不需要全局排序,这种方式开销极低,适合预览表数据结构。分页处理:配合
OFFSET 使用。注意:
分页建议:在大数据场景下,高偏移量的
OFFSET 会导致查询变慢(因为系统仍需读取并丢弃前面的行)。最佳实践是尽可能在应用端进行数据缓存。示例演示
基础用法
-- 获取满足条件的前 2 条记录SELECT x FROM numbers WHERE x > 2 LIMIT 2;
Top-N 排序
-- 获取数值最高的前 3 名SELECT x AS "Top 3" FROM numbers ORDER BY x DESC LIMIT 3;
偏移量分页
-- 跳过前 2 行,获取接下来的 3 行记录SELECT * FROM numbers LIMIT 3 OFFSET 2;
特殊限制与说明
子查询限制:在
EXISTS 和 IN 操作符中使用的相关子查询内部,严禁使用 LIMIT 子句。顺序保证:若不配合
ORDER BY 使用,LIMIT 返回的行具有不确定性,即多次执行结果可能因分布式扫描顺序不同而改变。