最近遇到一个核心的金融项目,规模很大,客户主要使用oracle数据库。现在需要进行适配ob数据库,原先在oracle中使用的是分区表,迁移到ob后需要进行改造。
在oracle中,默认使用的是堆表(ht),而ob使用的是索引组织表(iot),由于表的原理不同,因此分区表会有一些区别。
1、表无主键,创建范围分区表
在没有主键的情况下创建分区表,只需提前确认好分区列、分区列的类型和分区规则即可。
由于历史原因,以前很多使用堆表的业务都没有使用主键。如果这类没有主键的表迁移到ob数据库,ob会建议创建必要的主键索引。
如果业务无法找到合适的列创建主键索引,上述SQL也可以兼容oracle,在ob_oracle租户可以直接创建成功。
2、表有主键,创建范围分区表
但是表有主键的情况下,情况会稍微复杂一些。在oracle中,由于是堆表,可以按以下方式创建分区表,主键和分区键之间可以没有关联。
但是在ob中,如果需要创建带有主键的分区表,分区列必须是主键列的一部分。
参考官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820771
如果ob_oracle创建分区表使用单独的列会报错:ORA-00600: internal error code, arguments: -5261,A PRIMARY KEY must include all columns in the table's partitioning function。
ob_oracle正确创建分区表的方式:
但是这样会有一个问题,就是原先在oracle上order_id是主键,而在ob之后是order_id和order_date成为组合索引。
如果业务代码层面没有进行数据校验的逻辑,会在order_id上产生重复数据,这与原有的业务逻辑不符。
其实很简单,只需要对order_id加一个唯一索引即可实现在oracle上相同的逻辑。
这样一来,order_id就不会出现重复数据,而且ob分区表的逻辑也能和oracle对得上。