问题现象
OMS 做全量校验时会生成,如下语句。
select /+QUERY_TIMEOUT(600000000) END_OUTLINE_DATA/ TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,NON_UNIQUE,SEQ_IN_INDEX,COLUMN_NAME,SUB_PART from information_schema.STATISTICS where ((TABLE_SCHEMA='test27db' AND TABLE_NAME in ('test_table1','test_table4')) OR (TABLE_SCHEMA='test04db' AND TABLE_NAME in ('test_table4','test_table3')) OR ...
执行后报错内存不足 No memory or reach tenant memory limit。 复现的日志查看到 sqlExecutor 模块占用内存 120 + G。

问题原因
在抽取形如 (c1 in (1,2,3) and c2 cmp 1) or (c1 = 1 and c2 cmp 1) 谓词的 range 时,开启 in 优化的逻辑需要对部分 range graph 做深拷贝。其中 or 的数量越多,拷贝的次数就越多,导致 query range 抽取内存占用多。
适用版本
OceanBase 数据库 V4.2.1 BP1(oceanbase-4.2.1.1-101000062023103122)之前所有版本。
解决方法及规避方式
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.2(oceanbase-4.2.2.0-100000082024011317)及之后版本。
规避方式:
在 OceanBase 数据库 V4.2.1 版本中临时规避建议关闭 in 优化,命令如下。
alter system set _enable_in_range_optimization = 0;注意
有些大 in 的场景可能会导致内存开销增加。