LIMIT 子句

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

我的收藏
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;

特殊限制与说明

子查询限制:EXISTSIN 操作符中使用的相关子查询内部,严禁使用 LIMIT 子句。
顺序保证:若不配合 ORDER BY 使用,LIMIT 返回的行具有不确定性,即多次执行结果可能因分布式扫描顺序不同而改变。