【 使用环境 】生测试环境
【 OB or 其他组件 】
【 使用版本 】4.3.3.1
【问题描述】正常非分区表导入800W的数据THREAD=8,BATCH=80耗时7分钟,添加日期字段LIST/RANGE分区导入耗时一个半个小时,分区表导入时警告【warn】calculate partition id failed,但是正常导入完成,分区表Obloader是否有更好的优化方法。
按照官网文档的步骤做下优化,分别调整下命令行参数、jvm参数和数据库参数
https://www.oceanbase.com/docs/common-oceanbase-dumper-loader-1000000002781919
一、警告解释:calculate partition id failed
这个警告意味着:
ObLoader 无法根据某些字段值提前准确定位数据应该落在哪个分区,需要将数据发送到多个分区进行尝试,从而触发慢路径。
这个警告通常发生在以下情况:
分区键列没有出现在导入的数据中或无法解析其值(例如 NULL、格式问题)
分区键在数据中存在但 ObLoader 配置未正确指定分区键
导入时未启用分区优化(如 ENABLE_PARTITION_CALC)
二、优化建议
-
确保 ObLoader 能计算 partition id
使用 --partition_mode=calculated(开启计算分区ID)
明确指定分区键字段,确保其出现在每一行数据中,且格式正确
如果是时间字段 RANGE 分区,注意时间格式和时区的一致性
示例命令行加上参数:
obloader --thread=8 --batch=80 --partition_mode=calculated --enable_strict_mode=true …
-
设置正确的 partition_id_strategy 参数
ObLoader 的参数 partition_id_strategy 可选:
calculated: 主推方式,可显著提升分区表导入效率 random: 性能最差,不推荐 by_part_func: 更智能方式,需明确分区表达式和列
确保在配置文件或命令行中显式开启 partition_id 计算
-
尽量 避免 NULL 值 出现在分区键字段
如果数据中存在 NULL,会导致无法正确判断应该落在哪个分区,建议预处理时:
补全默认值
把 NULL 替换为合法分区值
或者调整分区定义,包含 NULL 落入某个默认分区
-
使用 OBLoader 支持的 CSV 格式避免格式不规范问题
确保导入文件格式、字段分隔符等符合 ObLoader 要求
分区字段的数据要格式正确(特别是日期/时间)
-
并发参数微调
尝试调整 THREAD / BATCH 配置:
分区表中,如果分区数多,THREAD 数量适当提高可能带来收益(如 THREAD=16 或 32)
但注意机器 IO 和网络带宽限制
三、性能差异的根本原因
原因 说明
分区计算失败走慢路径 导致每行都需要尝试多个分区,极大消耗 CPU 和网络
分区键数据异常或缺失 导致 ObLoader 无法正确路由数据
ObLoader 参数配置缺失 没有开启 partition id 计算优化
https://www.oceanbase.com/docs/common-oceanbase-dumper-loader-1000000002781925
您要是满足 :第一次入库的话 这个条件
高版本支持:单个分区的旁路导入, 您可以关注下怎么 用。
啥意思,确保 ObLoader 能计算 partition id,使用 --partition_mode=calculated(开启计算分区ID)这个无法使用嘛?分区表导入优化只能使用旁路导入
导入的命令提供一下 obloader的版本提供一下
不添加–partition_mode=calculated计算是正常导入分区表的,只是慢,添加后–partition_mode=calculated报错,查看文档是没有这个命令行项的,旁路现在试下,命令语句如下
OB LOADER版本4.3.3.1
warn级别的日志输出可能是由于表的列数目和数据文件的列数目不匹配导致,这个不影响导入,已有dima追踪,在434版本中将会修复。目前对于分区表导入需要确保待导入的表和数据文件的列相匹配才能进行分区计算。除此之外,还可以增加–thread线程数目,采用旁路导入等方式
现确保待导入的表和数据文件的列相匹配,单分区表的列数目和数据文件的列数目匹配,耗时很快十几分钟,多分区warn无法计算分区ID,耗时一个多小时,多分区时有方法准确匹配分区嘛?
目前只有上面说的方法 “目前对于分区表导入需要确保待导入的表和数据文件的列相匹配才能进行分区计算”
确保待导入的表和数据文件的列相匹配才能进行分区计算,这个有没有规范说明啊,LIST分区=20250525,文件对应的列也是20250525,是匹配的,多个分区时候无法计算分区
提供下表的ddl以及数据的样本来看看
原因找到了,CTL和表结构不一致,表字段较CTL多,导致多分区表入库时无法提前计算放置那个分区,需要将数据发送到多个分区进行尝试,从而触发慢路径。调整一致就解决了
你说的CTL是值的控制文件么?
是的
不过用控制文件扩张列的数目,会遇到这个问题
可以