本文介绍 OceanBase 数据库无主键表的实现以及使用注意事项。
适用版本
OceanBase 数据库 V2.2.7x 及后续版本
无主键表
无主键表是指在创建表时没有指定主键的表,此时 OceanBase 数据库会采用一个自增的列作为隐藏主键。隐藏主键的数据类型为 BIGINT,最大值为 2^64^。
无主键表可以通过物理 rowid 的方式快速定位到行。
隐藏主键的单调性与连续性
对于单分区表,隐藏主键是单调唯一且递增的。
对于多分区表,隐藏主键能够保证唯一,但无法保证在全局范围内单调递增。 这是由于 OceanBase 数据库会为 BIGINT 类型的自增列预分为 1 亿个序列号,保证自增值在分区内递增,但在分区间无法保证单调。例如,为隐藏主键分配的 1 亿序列号耗尽后,OceanBase 数据库会取下一段缓存,但这段缓存的起点不一定是 100000001。 为保证隐藏主键在分区内递增,当一个分区的 Leader 加入当前 OBServer 时,OceanBase 数据库会将该机器上的自增值缓存清空,重新取一段。
此外,由于隐藏主键是基于自增列实现的,因此存在跳变的场景,有关 OceanBase 数据库自增列跳变的场景,请参见 OceanBase 数据库自增列特性介绍。
隐藏主键的幂等性
无主键表的隐藏主键对普通用户的读写都是不可见的,如果无主键表中其他列不存在逻辑上的 UNIQUE 约束,那么无主键表的 INSERT 操作是无法做到幂等的。
注意事项
使用无主键表时,需要注意以下事项:
当高速加载数据到无主键表时(或者跨城、RootService 宕机或网络性能抖动等 HA 场景时),为了避免同步锁的性能消耗,可以考虑调整
autoinc_cache_refresh_interval配置项的值 ,以实现类似于disable value sync的效果。autoinc_cache_refresh_interval用于设置自增列缓存的刷新间隔,默认为 3600s。该配置项不能小于无主选举的时间间隔(默认为 10s)。 有关该配置项的详细信息,请参见《OceanBase 数据库参考指南》中的 系统配置项 章节。目前无主键分区表不支持全局索引。
OceanBase 数据库的 Oracle 模式不支持
ALTER SYSTEM ADD PRIMARY KEY操作,因此创建无主键表后,不支持修改为主键表。