首批通过分布式安全可靠测评,为关键业务系统打造
不含参数的可计算表达式抽出的 query range 错误
更新时间:2026-05-26 09:46
问题现象
使用 sysdate 表达式抽 query range,命中 plan cache 时结果错误。 例如:
create table t1(c1 date primary key);
select count(*) from t1 where c1 < sysdate;
insert into t1 values(sysdate);
call dbms_lock.sleep(1);
--预期返回1,实际返回0
select count(*) from t1 where c1 < sysdate;
问题原因
sysdate 的结果在一个 query 内是相同的,在不同 query 中的结果是不同的。对于这类表达式,可以抽 query range,但需要在每次命中 plan cache 后重新计算表达式的结果再生成最终的 query range。抽 query range 时判断一个表达式的结果在不同 query 中是否相同的依据是是否包含参数化的常量,导致 sysdate 抽出的 query range 每次命中 plan cache 时使用的都是计划生成时的结果。类似的表达式包含 utc_timestamp、utc_time、utc_timestamp、curtime、user、host_ip 等。
问题的风险及影响
业务查询结果错误。
影响版本
OceanBase 数据库 V4.1.0 BP2(oceanbase-4.1.0.1-102000042023061309) 及之前的 BP 版本。
解决方法及规避方式
升级到问题已修复版本。目前已修复的版本包含 OceanBase 数据库 V4.1.0 BP3(oceanbase-4.1.0.2-103000072023081111) 及之后版本。
关闭 plan cache,或者在条件中增加一个不影响结果的常量。例如在问题现象的示例中,可以按照如下修改。
select count(*) from t1 where c1 < sysdate - 0;