OceanBaseデータベースでは、事前に自動パーティションルールを設定し、データが一定の量に達した際に自動的にパーティション分割操作を行います。これにより、データ増加時のデータベーステーブルの自動拡張が可能となり、単一パーティションにおけるデータ量の増加によるロードバランシングやパフォーマンスなどの問題を回避できます。
自動パーティション分割操作のサポート状況
現在のバージョンでは、Rangeパーティションの一階層パーティションに対して、主キーを持つテーブルのみに自動パーティション機能がサポートされています。
制限事項と注意点
- リストパーティションテーブルやハッシュパーティションテーブルの自動スプリットはサポートされていません。
- セカンダリパーティションテーブルの自動スプリットはサポートされていません。
- 自動スプリットされるテーブルのパーティションキーとプライマリキーのプレフィックスが異なる場合、サポートされていません。
- プライマリキーを持たないテーブルの自動スプリットはサポートされていません。
- カラムストアテーブルの自動スプリットはサポートされていません。
- カラムストアレプリカの自動スプリットはサポートされていません。
- テーブルが属する
TABLEGROUP(テーブルグループ)に複数のテーブルが含まれている場合、自動スプリットはサポートされていません。ただし、このTABLEGROUPにそのテーブルのみが含まれている場合は、自動スプリットをサポートします。 - マテリアライズドビューの自動スプリットはサポートされていません。
- 全テキストインデックスの自動スプリットはサポートされていません。
- GISインデックスの自動スプリットはサポートされていません。
- ベクトルインデックスの自動スプリットはサポートされていません。
- OceanBaseデータベースでは、バージョンV4.3.5 BP2以降、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') | オプションです。パーティションのスプリットしきい値を指定します。SIZE() 句が省略されている場合、デフォルトではテナントレベルの構成パラメータ auto_split_tablet_size の値が使用されます。size_value には unlimited を指定できます。これは、スプリットしきい値に制限がないことを意味し、スプリットされず、以降の新しい自動パーティションスプリットもスケジュールされません。 |
| 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() 内にプリパーティションキー情報を入力した場合は、Schema内の対応するレコードが変更されます。情報が入力されていない場合は、元の設定を維持します。 |
| SIZE('size_value') | オプションです。テーブルの自動パーティションしきい値を変更します。size_value を unlimited に変更すると、既存のパーティションには影響を与えず、以降の新しい自動パーティション分割スケジュールは行われません。 |
| range_partition_list | オプションです。パーティションルールを変更します。SIZE 句を使用しない場合でもパーティション定義を指定した場合は、パーティションルールのみが変更され、既存の自動パーティション定義には影響しません。
注意OceanBaseデータベースのOracleモードでは、パーティションテーブルのパーティション定義の変更はサポートされていません。 |
テナントレベルの自動パーティション設定
テナントレベルの構成パラメータ enable_auto_split と auto_split_tablet_size を設定することで、グローバルな設定に基づいて、テナント内の要件を満たすテーブルの自動分割を制御します。CREATE TABLE 時に SIZE シンタックスを省略した場合、以下のテナントレベルの構成パラメータに基づいて自動パーティションテーブルが作成されるかどうかを決定します(デフォルトでは主キー列を使用して自動パーティションテーブルのパーティションキーを指定します)。
- enable_auto_split:テナントレベルの構成パラメータで、テナントが自動パーティション機能を有効にするかどうかを制御します。デフォルトは無効です。
- auto_split_tablet_size:テナントレベルの構成パラメータで、テナントが自動パーティション機能を有効にした後、分割をトリガーするしきい値を制御します。デフォルト値は128MBです。
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';を使用して、自動パーティション機能が有効になっているかどうかを確認できます。分割しきい値を10GBに指定し、事前パーティションキーを指定せずに自動パーティションテーブル
test1_tbl1を作成します。CREATE TABLE test1_tbl1 (col1 NUMBER, col2 NUMBER, col3 VARCHAR2(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE() SIZE('10GB');事前パーティションキーを
col1に指定し、分割しきい値を10GBに指定して自動パーティションテーブルtest1_tbl2を作成します。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();事前パーティションキーを
col1, col2に指定し、分割しきい値を10GBに指定して自動パーティションテーブルtest1_tbl4を作成します。同時に、パーティションポイント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パーティションを使用するように設定されているため、以下の通常のテーブル作成構文は自動パーティションを作成し、テナントレベルの構成パラメータ(デフォルトの128MBをスプリットしきい値として使用)を読み込みます。CREATE TABLE test3_tbl1 (col1 INT, col2 INT, PRIMARY KEY(col1));パーティションテーブル
test3_tbl2を作成します(デフォルトの128MBをスプリットしきい値として使用)。パーティションキーを指定していないため、主キーをパーティションキーとして使用します。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;