OceanBaseデータベースでは、事前に自動パーティションルールを設定し、データが一定量に達すると自動的にパーティションの分割を行います。これにより、データ量の増加に応じてデータベーステーブルを自動的に拡張でき、単一パーティションのデータ量が過大になることによる負荷分散やパフォーマンスの問題を回避できます。
自動パーティション分割のサポート状況
現在のバージョンでは、Rangeパーティションのパーティションに主キーテーブルがある場合にのみ、自動パーティション機能をサポートしています。
使用上の制限と注意事項
- ListパーティションやHashパーティションテーブルの自動分割はサポートされていません。
- セカンダリパーティションテーブルの自動分割はサポートされていません。
- 自動分割されるテーブルのパーティションキーと主キーのプレフィックスが異なる場合はサポートされていません。
- 主キーのないテーブルの自動パーティション分割はサポートされていません。
- カラムストアテーブルの自動パーティション分割はサポートされていません。
- カラムストアレプリカの自動パーティション分割はサポートされていません。
- テーブルが存在する
TABLEGROUP(テーブルグループ)に複数のテーブルが含まれている場合、自動パーティション分割はサポートされていません。このTABLEGROUPにこのテーブルのみが含まれている場合は、自動パーティション分割をサポートします。 - マテリアライズドビューの自動パーティション分割はサポートされていません。
- フルテキストインデックスの自動分割はサポートされていません。
- 空間インデックスの自動分割はサポートされていません。
- ベクトルインデックスの自動分割はサポートされていません。
- OceanBaseデータベースは global_index_auto_split_policy構成パラメータをサポートしており、新規作成されるグローバルインデックスで自動パーティション機能を有効にするかどうかを制御します。新規作成されたグローバルインデックスで自動パーティションが有効になっている場合、データ量に応じてパーティションルールを再生成し、事前に分割します。
テーブルレベルの自動パーティション設定
CREATE TABLE の際に、SIZE 句を設定することで、単一の自動パーティションテーブルを作成します。
テーブル作成時の自動パーティション構文
CREATE TABLE table_name (column_definition_list, PRIMARY KEY(column_name_list))
PARTITION BY RANGE([column_name_list]) [SIZE('size_value')]
[(range_partition_list)];
column_definition_list:
column_definition[, column_definition ...]
column_name_list:
column_name[, column_name ...]
range_partition_list:
PARTITION partition_name VALUES LESS THAN (value_list)[, PARTITION partition_name VALUES LESS THAN (value_list) ...]
value_list:
value[, value ...]
パラメータの説明
パラメータ |
説明 |
|---|---|
| table_name | テーブル名を指定します。 |
| column_definition_list | 列定義リストを指定します。列名、データ型、制約などが含まれます。詳細については、CREATE TABLEを参照してください。 |
| PRIMARY KEY | テーブルの主キーを指定します。 |
| PARTITION BY RANGE([column_name_list]) | 事前パーティションキーを指定します。自動パーティションがトリガーされると、入力された事前パーティションキーが実際のパーティションキーとして使用されます(column_name_list を指定しない場合は、主キーがパーティションキーとして使用されます)。 |
| SIZE('size_value') | オプションです。パーティションの分割しきい値を指定します。値の範囲は [1MB, +∞)です。SIZE() 句が省略された場合、テナントレベルの構成パラメータ auto_split_tablet_size の値がデフォルトで読み込まれます。size_value には unlimited を指定でき、これは分割しきい値に制限がなく、分割されず、今後新しい自動パーティション分割のスケジューリングも行われないことを意味します。
説明V4.4.2バージョンでは、V4.4.2 BP1バージョン以降、自動パーティション分割のしきい値の下限が128MBから1MBに調整されました。 注意テーブルのデータ量が多いシナリオでは、 |
| range_partition_list | オプションです。事前にパーティションポイント(パーティションルール)を作成します。
注意事前にパーティションポイントを作成する場合は、事前パーティションキーを指定する必要があります。指定しない場合は、エラーが発生します。 |
テーブルの自動パーティション属性を変更する構文
ALTER TABLE table_name
[MODIFY] PARTITION BY RANGE([column_name_list]) [SIZE('size_value')]
[(range_partition_list)];
column_name_list:
column_name[, column_name ...]
range_partition_list:
PARTITION partition_name VALUES LESS THAN (value_list)[, PARTITION partition_name VALUES LESS THAN (value_list) ...]
value_list:
value[, value ...]
説明
ALTER TABLE ... PARTITION BY ... ステートメントを使用する際にパーティションルールが定義されていない場合、Online DDL方式でテーブルの自動パーティション属性を変更し、既存のパーティション定義には影響しません。
パラメータの説明
パラメータ |
説明 |
|---|---|
| column_name_list | 非パーティションテーブルのプリパーティションキーを変更します。ALTER TABLE ステートメントを使用して非パーティションテーブルの自動パーティション属性を変更する際、RANGE() にプリパーティションキー情報を記述した場合は、スキーマ内の対応するレコードが変更されます。情報を記述しない場合は、既存の設定が維持されます。 |
| SIZE('size_value') | オプションです。テーブルの自動パーティションしきい値を変更します。値の範囲は [1MB, +∞) です。size_value を unlimited に変更しても、既存のパーティションには影響せず、今後新しい自動パーティションの分割はスケジュールされません。
説明V4.4.2バージョンでは、V4.4.2 BP1バージョン以降、自動パーティション分割のしきい値の下限が128MBから1MBに調整されました。 注意テーブルデータ量が多いシナリオでは、 |
| range_partition_list | オプションです。パーティションルールを変更します。SIZE 句を使用せずにパーティション定義を指定した場合、パーティションルールのみが変更され、既存の自動パーティション定義には影響しません。
注意OceanBaseデータベースのOracleモードでは、パーティションテーブルのパーティション定義の変更は現在サポートされていません。 |
テナントレベルの自動パーティション設定
テナントレベルの構成パラメータ enable_auto_split と auto_split_tablet_size を設定することで、要件を満たすテナント内のテーブルに対して、グローバル設定に基づいてテーブルの自動分割を制御できます。CREATE TABLE 時に SIZE 構文を省略した場合、以下のテナントレベルの構成パラメータに基づいて自動パーティションテーブルを作成するかどうかが決定されます(デフォルトでは、主キーカラムが自動パーティションテーブルのパーティションキーとして使用されます)。
- enable_auto_split:テナントレベルの構成パラメータで、テナントの自動パーティション機能を有効にするかどうかを制御します。
- auto_split_tablet_size:テナントレベルの構成パラメータで、テナントの自動パーティション機能を有効にした後、分割をトリガーするしきい値を制御します。
SIZE 構文を省略し、かつ enable_auto_split を true に設定した場合、分割制限に合致するテーブルにのみ自動パーティションが設定され、制限に合致しないテーブルには適用されません。例えば、サブパーティションテーブル、非Rangeパーティションテーブル、主キーのないテーブル、またはパーティションキーが主キーのプレフィックスと一致しないパーティションテーブルを作成すると、通常は非自動パーティションテーブルとして作成されます(ユーザーが手動で自動パーティションの特殊な構文を記述した場合でもエラーが発生します)。
説明
ビュー sys.ALL_TABLES/sys.DBA_TABLES/sys.USER_TABLES を使用するか、システムテナントで oceanbase.CDB_TABLES を使用して、テーブルの自動パーティション属性を確認できます。
自動パーティションの動作説明
自動パーティションのDDL操作
- パーティションルールの変更:パーティションを主キーのRangeパーティションに変更する場合のみサポートされます。その他のパーティションルールの変更はサポートされません。
- 主キーの変更:主キー変更後の自動パーティションキーが主キーのプレフィックスである必要があります。
- 列操作:プリパーティションキーの操作制限は、パーティションキーと同等です。
説明
その他のDDL操作は、非自動パーティションテーブルと同じ要件が適用されます。
DML動作
分割プロセス中は、分割前後の2つのスキーマが共存する状態となり、ソースパーティションとターゲットパーティションのDML動作は、同一のデータに対して操作を行っているかのように処理されます。例えば、ソースパーティションへの書き込みやクエリは、可能な限り対応するターゲットパーティションへのクエリや書き込みに変換されます。ターゲットパーティションへの書き込みやクエリは、ソースパーティションから転送された書き込みを認識します。具体的な動作は以下の通りです:
N/A |
ソースパーティションを指定したDML(INSERT INTO t1 PARTITION(p0) ...) |
ソースパーティションに関わるDML(SELECT * FROM t1) |
ターゲットパーティションを指定したDML |
ターゲットパーティションに関わるDML |
|---|---|---|---|---|
| 分割開始トランザクション前 | 正常 | 正常 | エラー、存在しないパーティションを操作した場合と同じ動作 | このケースなし |
| 分割中 | エラーが発生する可能性あり、エラー発生時は存在しないパーティションを操作した場合と同じ動作 | エラーなし、内部で書き込みの切り替えとクエリ文の再試行を行う | 正常 | 正常 |
| 分割終了トランザクション後 | エラー、存在しないパーティションを操作した場合と同じ動作 | このケースなし | 正常 | 正常 |
例
例1:テーブルレベルの自動パーティションテーブルを作成する
自動パーティション機能を無効にします。
AlTER SYSTEM SET enable_auto_split = FALSE;説明
SHOW PARAMETERS LIKE 'enable_auto_split';を使用して、自動パーティション機能が有効になっているかどうかを確認できます。自動パーティションテーブル
test1_tbl1を作成します。プリパーティションキーは指定せず、分割しきい値を10GBに設定します。CREATE TABLE test1_tbl1 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE() SIZE('10GB');自動パーティションテーブル
test1_tbl2を作成します。プリパーティションキーにcol1を指定し、分割しきい値を10GBに設定します。CREATE TABLE test1_tbl2 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');自動パーティションテーブル
test1_tbl3を作成します。プリパーティションキーと分割しきい値を指定しません(分割しきい値はデフォルトでauto_split_tablet_sizeの値が使用されます)。CREATE TABLE test1_tbl3 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE();自動パーティションテーブル
test1_tbl4を作成する際、プリパーティションキーにcol1, col2を指定し、分割しきい値を10GBに設定します。また、事前にパーティションポイントP0、P1、P2、P3を作成します。CREATE TABLE test1_tbl4 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1, col2) SIZE('10GB') (PARTITION P0 VALUES LESS THAN (100, MAXVALUE), PARTITION P1 VALUES LESS THAN (500, MAXVALUE), PARTITION P2 VALUES LESS THAN (800, MAXVALUE), PARTITION P3 VALUES LESS THAN (MAXVALUE, MAXVALUE));テーブルの自動パーティション属性を確認します。
SELECT OWNER, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM sys.ALL_TABLES WHERE TABLE_NAME LIKE 'TEST1%' ORDER BY TABLE_NAME;実行結果は次のとおりです:
+-------+------------+------------+------------------------+ | OWNER | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +-------+------------+------------+------------------------+ | SYS | TEST1_TBL1 | TRUE | 10737418240 | | SYS | TEST1_TBL2 | TRUE | 10737418240 | | SYS | TEST1_TBL3 | TRUE | 134217728 | | SYS | TEST1_TBL4 | TRUE | 10737418240 | +-------+------------+------------+------------------------+ 4 rows in set
例2:テーブルの自動パーティション属性を変更する
自動パーティションテーブル
test2_tbl1を作成します。プリパーティションキーにcol1を指定し、分割しきい値を10GBに設定します。CREATE TABLE test2_tbl1 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');テーブル
test2_tbl1の自動パーティションしきい値を1GBに変更します。ALTER TABLE test2_tbl1 PARTITION BY RANGE() SIZE('1GB');または
ALTER TABLE test2_tbl1 PARTITION BY RANGE(col1) SIZE('1GB');自動パーティションテーブル
test2_tbl2を作成し、プリパーティションキーをcol1、分割しきい値を10GBに指定します。CREATE TABLE test2_tbl2 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');テーブル
test2_tbl2にパーティションポイントp0(値が100未満の行)、p1(値が100以上200未満の行)、p_max(値が200以上の行)を追加します。ALTER TABLE test2_tbl2 PARTITION BY RANGE(col1) SIZE('10GB') (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p_max VALUES LESS THAN (MAXVALUE));自動パーティションテーブル
test2_tbl3を作成し、プリパーティションキーをcol1、分割しきい値を10GBに指定します。CREATE TABLE test2_tbl3 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');テーブル
test2_tbl3の自動パーティションを禁止します。変更後は既存のパーティションに影響せず、今後新たな自動パーティションの分割はスケジュールされません。ALTER TABLE test2_tbl3 PARTITION BY RANGE() SIZE('unlimited');自動パーティションテーブル
test2_tbl4を作成し、プリパーティションキーをcol1、分割しきい値を10GBに指定します。CREATE TABLE test2_tbl4 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');テーブル
test2_tbl4のプリパーティションキーをcol1からcol1,col2に変更します。ALTER TABLE test2_tbl4 PARTITION BY RANGE (col1,col2) SIZE('10GB');非自動パーティションテーブル
test2_tbl5を作成します。CREATE TABLE test2_tbl5 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2));SIZE句を指定せずにテーブルtest2_tbl5を自動パーティションテーブルに変更します。分割しきい値はデフォルトでauto_split_tablet_sizeの値が使用されます。ALTER TABLE test2_tbl5 PARTITION BY RANGE (col1);テーブルの自動パーティション属性を確認します。
SELECT OWNER, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM sys.ALL_TABLES WHERE TABLE_NAME LIKE 'TEST2%' ORDER BY TABLE_NAME;実行結果は次のとおりです:
+-------+------------+------------+------------------------+ | OWNER | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +-------+------------+------------+------------------------+ | SYS | TEST2_TBL1 | TRUE | 1073741824 | | SYS | TEST2_TBL2 | TRUE | 10737418240 | | SYS | TEST2_TBL3 | FALSE | 0 | | SYS | TEST2_TBL4 | TRUE | 10737418240 | | SYS | TEST2_TBL5 | TRUE | 134217728 | +-------+------------+------------+------------------------+ 5 rows in set
例3:自動パーティション機能を有効にした後でテーブルを作成する
自動パーティション機能を有効にします。
AlTER SYSTEM SET enable_auto_split = TRUE;非パーティションテーブル
test3_tbl1を作成します。テナントレベルですべての非パーティションテーブルが自動的に SIZE パーティションを使用するよう設定されているため、通常のテーブル作成構文は自動パーティションを行い、テナントレベルのパラメータを読み取ります。CREATE TABLE test3_tbl1 (col1 INT, col2 INT, PRIMARY KEY(col1));自動パーティションの非パーティションテーブル
test3_tbl2を作成します。パーティションキーを指定しないため、デフォルトで主キーがパーティションキーとして使用されます。CREATE TABLE test3_tbl2 (col1 INT, col2 INT, PRIMARY KEY(col1)) PARTITION BY RANGE ();自動パーティションの非パーティションテーブル
test3_tbl3を作成します(分割しきい値は1024MB、ユーザー設定を使用)。CREATE TABLE test3_tbl3 (col1 INT, col2 INT, PRIMARY KEY(col1)) PARTITION BY RANGE () SIZE('1024MB');非自動パーティションテーブル
test3_tbl4を作成します。CREATE TABLE test3_tbl4 (col1 INT, col2 INT, PRIMARY KEY(col1)) PARTITION BY RANGE () SIZE('unlimited');主キーのないテーブルは自動パーティション要件を満たさないため、
enable_auto_split = trueでも自動パーティションは有効になりません。CREATE TABLE test3_tbl5 (col1 INT, col2 INT);主キーのないテーブルは自動パーティション要件を満たさないため、手動で自動パーティションを有効にするとエラーが発生します。
CREATE TABLE test3_tbl6 (col1 INT, col2 INT) PARTITION BY RANGE ();実行結果は次のとおりです:
OBE-00600: internal error code, arguments: -4007, auto partitioned table without primary key is not supportedテーブルの自動パーティション属性を確認します。
SELECT OWNER, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM sys.ALL_TABLES WHERE TABLE_NAME LIKE 'TEST3%' ORDER BY TABLE_NAME;実行結果は次のとおりです:
+-------+------------+------------+------------------------+ | OWNER | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +-------+------------+------------+------------------------+ | SYS | TEST3_TBL1 | TRUE | 134217728 | | SYS | TEST3_TBL2 | TRUE | 134217728 | | SYS | TEST3_TBL3 | TRUE | 1073741824 | | SYS | TEST3_TBL4 | FALSE | 0 | | SYS | TEST3_TBL5 | FALSE | 0 | +-------+------------+------------+------------------------+ 5 rows in set
例4:グローバルインデックスで自動パーティションを有効にする
説明
自動パーティションが有効なテーブルでは、構成パラメータ global_index_auto_split_policy が無効であっても、作成されるグローバルインデックスは自動的にパーティション化されます。
自動パーティションテーブル
test4_tbl1を作成します(分割しきい値は1024MB、ユーザー設定を使用)。CREATE TABLE test4_tbl1 (col1 INT, col2 INT, col3 INT, PRIMARY KEY(col1)) PARTITION BY RANGE () SIZE('1024MB');テーブル
test4_tbl1にグローバルインデックスidx1_test4_tbl1を作成します。CREATE INDEX idx1_test4_tbl1 ON test4_tbl1 (col2) GLOBAL;自動パーティション機能を有効にします。
ALTER SYSTEM SET global_index_auto_split_policy = 'ALL';非自動パーティションのパーティションテーブル
test4_tbl2を作成します。CREATE TABLE test4_tbl2(col1 INT, col2 INT, col3 INT, PRIMARY KEY(col1)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300));テーブル
test4_tbl2にグローバルインデックスidx1_test4_tbl2を作成します。CREATE INDEX idx1_test4_tbl2 ON test4_tbl2 (col2) GLOBAL;