OceanBaseデータベースでは、DYNAMIC_PARTITION_POLICY ブロックを変更することで、テーブルの動的パーティション管理属性を変更できます。
本記事では、SQLステートメントを使用して動的パーティションテーブルを変更する方法について説明します。
使用上の制限と注意事項
動的パーティション管理パラメータの変更は、パーティションの事前作成や期限切れパーティションの削除に即時には反映されません。次回の動的パーティション管理タスクが自動的にスケジュールされるのを待つか、手動で動的パーティション管理タスクを1回スケジュールする必要があります。動的パーティション管理タスクのスケジュールに関する詳細は、動的パーティション管理タスクを参照してください。
TIME_UNIT、TIME_ZONE、BIGINT_PRECISIONパラメータは動的パーティションテーブル作成時に指定し、一度指定すると変更できません。動的パーティションポリシーを変更する際に
TIME_UNITを指定するかどうかは、テーブルで動的パーティション管理が有効になっているかどうかによって異なります。- 動的パーティション管理が有効なテーブルでは、
TIME_UNITを指定する必要はなく、変更ステートメント内でも指定できません(指定するとエラーが発生します)。 - 動的パーティション管理が有効でないテーブル(通常のパーティションテーブルなど)では、変更ステートメント内で
TIME_UNITを指定する必要があります。
- 動的パーティション管理が有効なテーブルでは、
権限要件
動的パーティションテーブルを変更するには ALTER 権限が必要です。OceanBaseデータベースの権限に関する詳細は、Oracleモードの権限分類を参照してください。
構文
動的パーティションテーブルを変更するSQLステートメントの形式は以下のとおりです:
ALTER TABLE table_name [SET] DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list);
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_UNIT はテーブル作成時に指定し、一度指定すると変更できません:動的パーティション管理が有効なテーブルを変更する場合は TIME_UNIT を指定できません。動的パーティション管理が有効でないテーブルに動的パーティションポリシーを追加する場合は、TIME_UNIT を指定する必要があります。
動的パーティション管理属性パラメータの説明
プロパティ名 |
説明 |
必須 |
変更は可能か |
|---|---|---|---|
| ENABLE | 動的パーティション管理を有効にするかどうかを示します。値は以下のとおりです:
|
いいえ | はい |
| TIME_UNIT | パーティションの時間単位、つまり自動的に作成されるパーティション境界の間隔を示します。値は以下のとおりです:
説明
|
いいえ | いいえ |
| PRECREATE_TIME | 事前作成時間を示します。動的パーティション管理を1回スケジュールすると、パーティションの上限値の最大値 > now() + precreate_time になるようにパーティションが事前作成されます。値は以下のとおりです:
説明
|
いいえ | はい |
| EXPIRE_TIME | パーティションの有効期間を示します。動的パーティション管理を1回スケジュールすると、パーティションの上限値 < now() - expire_time のすべての期限切れパーティションが削除されます。値は以下のとおりです:
|
いいえ | はい |
テーブルの変更構文における各パラメータの詳細については、ALTER TABLEを参照してください。
例
テーブルを作成します。
-- テーブル作成:TIME_UNIT='hour' 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') );テーブル
test_tbl1の動的パーティション情報を確認します。SELECT * FROM sys.DBA_OB_DYNAMIC_PARTITION_TABLES WHERE TABLE_NAME = 'TEST_TBL1';クエリ結果は次のとおりです:
+---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | MAX_HIGH_BOUND_VAL | ENABLE | TIME_UNIT | PRECREATE_TIME | EXPIRE_TIME | TIME_ZONE | BIGINT_PRECISION | +---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ | SYS | TEST_TBL1 | 500037 | Timestamp '2024-11-11 13:30:00.000000' | TRUE | HOUR | 3HOUR | 1DAY | +8:00 | NONE | +---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ 1 row in set動的パーティションテーブル
test_tbl1を変更し、動的パーティション属性を以下のように設定します:- 現在時刻から1日以内のパーティションを事前作成します。
- パーティションは期限切れになりません。
ALTER TABLE test_tbl1 DYNAMIC_PARTITION_POLICY( ENABLE = true, PRECREATE_TIME = '1 day', EXPIRE_TIME = '-1' );再度、テーブル
test_tbl1の動的パーティション情報を確認します。SELECT * FROM sys.DBA_OB_DYNAMIC_PARTITION_TABLES WHERE TABLE_NAME = 'TEST_TBL1';クエリ結果は次のとおりです:
+---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | MAX_HIGH_BOUND_VAL | ENABLE | TIME_UNIT | PRECREATE_TIME | EXPIRE_TIME | TIME_ZONE | BIGINT_PRECISION | +---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ | SYS | TEST_TBL1 | 500037 | Timestamp '2024-11-11 13:30:00.000000' | TRUE | HOUR | 1DAY | -1 | +8:00 | NONE | +---------------+------------+----------+----------------------------------------+--------+-----------+----------------+-------------+-----------+------------------+ 1 row in set説明
動的パーティション管理パラメータの変更は、パーティションの事前作成や期限切れパーティションの削除に即時には反映されません。次回の動的パーティション管理タスクが自動的にスケジュールされるのを待つか、手動で動的パーティション管理タスクを1回スケジュールする必要があります。詳細については、動的パーティション管理タスクを参照してください。
まだ動的パーティション管理が有効になっていない通常のRANGEパーティションテーブルに動的パーティションポリシーを追加します。
通常のRANGEパーティションテーブル
test_tbl3を作成します。
```sql
CREATE TABLE test_tbl3 (col1 INT, col2 TIMESTAMP)
PARTITION BY RANGE (col2)(
PARTITION P0 VALUES LESS THAN (TIMESTAMP '2026-09-14 00:00:00')
);
```
test_tbl3に動的パーティションポリシーを追加し、動的パーティションのプロパティを設定します:
- パーティション境界を日単位で設定します。
- 現在時刻から3日以内のパーティションを事前作成します。
- パーティションの上限値が現在時刻の30日前より前のパーティションを削除します。
```sql
ALTER TABLE test_tbl3 DYNAMIC_PARTITION_POLICY(
ENABLE = true,
TIME_UNIT = 'day',
PRECREATE_TIME = '3 day',
EXPIRE_TIME = '30 day'
);
```
<main id="notice" type='explain'>
<h4>説明</h4>
<p><ul><li>動的パーティション管理が有効になっていないテーブルに動的パーティションポリシーを追加する場合、<code>TIME_UNIT</code> を指定する必要があります。</li><li>パーティションキーが時間型の場合、<code>TIME_ZONE</code> のデフォルト値は <code>default</code>、<code>BIGINT_PRECISION</code> のデフォルト値は <code>none</code> であり、省略できます。</li></ul></p>
</main>
- 手動で一度動的パーティション管理タスクをトリガーし、事前作成されたパーティションを確認します。
CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();
テーブル test_tbl3 のパーティション情報を確認します:
SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
FROM SYS.USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'TEST_TBL3'
ORDER BY PARTITION_POSITION;
クエリ結果には、事前に作成された3つの日単位のパーティションが表示されます。