首批通过分布式安全可靠测评,为关键业务系统打造
带有 rand 函数的 limit 语句结果错误
更新时间:2026-05-19 08:21
问题现象
多表连接,在过滤条件中存在 rand() 函数,且查询中存在 limit 限制,不管多表连接的中间结果有多少,查询出来的结果明显少于 limit 行数。
示例查询语句如下。
select
t1.c2,
t2.c2
from
t1
LEFT JOIN t2 on t1.c1 = t2.c1
where
cast(RAND() * 50 as signed) = 1
limit
100;
问题原因
由于触发了 limit push down 的改写,导致多表连接的中间结果被限制为 limit 行数,最终留给 rand() 条件的过滤行数变少,查询出来的结果明显少于limit 行数。
问题的风险及影响
导致业务查询出来的行数明显低于预期行数。
影响版本
OceanBase 数据库 V4.1.0 BP2(oceanbase-4.1.0.1-102000042023061309)、V3.2.3 BP9(oceanbase-3.2.3.3-109000182023071410)、V3.2.4 BP5(oceanbase-3.2.4.5-105000012023081513)及之前的 BP 版本。
解决方法及规避方式
- 使用
NO_PUSH_LIMIT这个 hint 来禁用这个改写。 - 升级到问题已修复版本,目前已修复的版本包含 V4.1.0 BP3(oceanbase-4.1.0.2-103000072023081111)、V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)、V3.2.4 BP6(oceanbase-3.2.4.6-106000052023102710)及之后版本。