首批通过分布式安全可靠测评,为关键业务系统打造
创建动态分区表
更新时间:2026-05-25 15:47:54
OceanBase 数据库通过 DYNAMIC_PARTITION_POLICY 块,在建表时指定表的动态分区管理属性。
本文将向您介绍如何使用 SQL 语句创建动态分区表。
使用限制及注意事项
- 当前版本创建动态分区表需要至少指定一个分区定义。
- 仅支持 Range 分区且分区键为
date、timestamp、timestamp with local time zone、number(指定BIGINT_PRECISION精度)类型的分区表可开启动态分区管理。 - 仅能对一级分区表和二级分区表的一级分区开启动态分区管理。
- 建表后预创建分区和删除过期分区的动作不会立刻执行,需要等待下一次动态分区管理任务自动调度,或者手动调度一次动态分区管理任务。调度动态分区管理任务的详细介绍,参见 动态分区管理任务。
权限要求
创建动态分区表需要有 CREATE TABLE 权限。更多有关 OceanBase 数据库权限的详细介绍,参见 Oracle 模式下的权限分类。
语法
创建动态分区表的 SQL 语句格式如下:
CREATE TABLE [IF NOT EXISTS] table_name (table_definition_list)
DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list)
partition_option;
dynamic_partition_policy_list:
dynamic_partition_policy_option [, dynamic_partition_policy_option ...]
dynamic_partition_policy_option:
ENABLE = {true | false}
| TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| TIME_ZONE = {'default' | 'time_zone'}
| BIGINT_PRECISION = {'none' | 'us' | 'ms' | 's'}
动态分区管理属性参数说明
| 属性名称 | 描述 | 是否必填 | 是否可修改 |
|---|---|---|---|
| ENABLE | 表示是否启用动态分区管理。取值如下:
|
否 | 是 |
| TIME_UNIT | 表示分区的时间单位,即自动创建分区边界的间隔。取值如下:
|
是 | 否 |
| PRECREATE_TIME | 表示预创建时间。调度一次动态分区管理,会预创建分区使得 最大分区上界 > now() + precreate_time。取值如下:
说明
|
否 | 是 |
| EXPIRE_TIME | 表示分区过期时间。调度一次动态分区管理,会删除所有 分区上界 < now() - expire_time 的过期分区。取值如下:
|
否 | 是 |
| TIME_ZONE | 表示判断当前时间与时间类型(date、timestamp 类型)分区键大小时,依赖的时区信息。取值如下:
|
否 | 否 |
| BIGINT_PRECISION | 表示 number 类型分区键的时间戳精度。取值如下:
|
否 | 否 |
更多有关创建表语法的详细参数说明信息,参见 CREATE TABLE。
动态分区参数限制
PRECREATE_TIME:最多预创建 2048 个分区。TIME_ZONE:分区键为date或timestamp类型时,参数TIME_ZONE才可以指定自定义时区偏移值,其他类型只能为default。BIGINT_PRECISION:只有分区键类型为number时,才可以指定该参数值为us、ms、s,其他分区键类型时该参数值只能为none。TIME_UNIT、TIME_ZONE、BIGINT_PRECISION指定后不能修改。
示例
创建动态分区表 test_tbl1,设置动态分区属性为:
- 分区边界按每小时划分。
- 预创建当前时间之后的 3 小时内的分区。
- 删除分区上界早于当前时间 1 天前的分区。
- 使用北京时间(UTC+8)判断时间,确保分区边界和过期逻辑基于该时区。
- 分区键
col2是TIMESTAMP类型,无需配置number的时间戳精度。
CREATE TABLE test_tbl1 (col1 INT, col2 TIMESTAMP)
DYNAMIC_PARTITION_POLICY(
ENABLE = true,
TIME_UNIT = 'hour',
PRECREATE_TIME = '3 hour',
EXPIRE_TIME = '1 day',
TIME_ZONE = '+8:00',
BIGINT_PRECISION = 'none')
PARTITION BY RANGE (col2)(
PARTITION P0 VALUES LESS THAN (TIMESTAMP '2024-11-11 13:30:00')
);
说明
建表后预创建分区和删除过期分区的动作不会立刻执行,需要等待下一次动态分区管理任务自动调度,或者手动调度一次动态分区管理任务。详细介绍,参见 动态分区管理任务。