OceanBaseデータベースでは、事前に自動パーティションルールを設定し、データが一定の規模に達すると自動的にパーティション分割操作を行います。これにより、データ増加時のテーブル拡張を自動化し、単一パーティションにおけるデータ量過多によるロードバランシングやパフォーマンスへの影響を回避できます。
自動のパーティション分割操作のサポート状況
現在のバージョンでは、Range/Range Columnsパーティション方式のパーティションに主キーを持つテーブルに対してのみ、自動パーティション分割機能がサポートされています。
制限事項と注意点
- リスト型およびハッシュ型パーティションテーブルの自動スプリットはサポートされていません。
- セカンダリパーティションテーブルの自動スプリットはサポートされていません。
- スプリットされるテーブルのパーティションキーと主キーのプレフィックスが異なる場合、自動スプリットはサポートされていません。
- 主キーを持たないテーブルの自動スプリットはサポートされていません。
- 列指向ストアテーブルの自動スプリットはサポートされていません。
- 列指向ストアレプリカの自動スプリットはサポートされていません。
- テーブルが属する
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 [COLUMNS]([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 [COLUMNS]([column_name_list]) | プリパーティションキーを指定します。自動パーティションがトリガーされた場合、入力されたプリパーティションキーが実際のパーティションキーとして使用されます(column_name_list が指定されていない場合は、主キーがパーティションキーとして使用されます)。
注意
|
| SIZE('size_value') | オプションです。パーティションのスプリットしきい値を指定します。SIZE() 句が省略されている場合、デフォルトでテナントレベルの構成パラメータ auto_split_tablet_size の値が使用されます。size_value には unlimited を指定できます。これは、スプリットしきい値が無制限であり、スプリットされず、その後の新しい自動パーティションのスプリットがスケジュールされないことを意味します。 |
| range_partition_list | オプションです。事前にパーティションポイント(パーティションルール)を作成します。
注意事前にパーティションポイントを作成する場合、プリパーティションキーを指定する必要があります。そうでない場合、エラーが報告されます。 |
テーブルの自動パーティションプロパティを変更する構文
ALTER TABLE table_name
PARTITION BY RANGE [COLUMNS]([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 句を使用しない場合でも、パーティション定義を指定した場合は、パーティションルールのみが変更され、元の自動パーティション定義には影響しません。 |
テナントレベルの自動パーティション構成
テナントレベルの構成パラメータ enable_auto_split と auto_split_tablet_size を設定することで、グローバル設定に基づいてテナント内の条件を満たすテーブルに対して自動分割を制御します。CREATE TABLE 時に SIZE 構文を省略した場合、以下のテナントレベルの構成パラメータに基づいて自動パーティションテーブルが作成されるかどうかを決定します(デフォルトでは主キー列を自動パーティションテーブルのパーティションキーとして使用します)。
- enable_auto_split:テナントレベルの構成パラメータで、テナントが自動パーティション機能を有効にするかどうかを制御します。デフォルトは無効です。
- auto_split_tablet_size:テナントレベルの構成パラメータで、テナントが自動パーティション機能を有効にした後の分割をトリガーするしきい値を制御します。デフォルト値は128MBです。
SIZE 構文を省略し、かつ enable_auto_split を true に設定した場合、分割しきい値を満たすテーブルのみに自動パーティションが設定され、その他のテーブルには適用されません。例えば、セカンダリパーティションテーブル、非 RANGE パーティションテーブル、主キーを持たないテーブル、またはパーティションキーが主キーのプレフィックスと一致しないパーティションテーブルを作成する場合、自動パーティションテーブルではなく通常のパーティションテーブルが作成されます(ユーザーが手動で自動パーティションの特別な構文を記述した場合は依然としてエラーが発生します)。
説明
information_schema.TABLES ビューを使用するか、システムテナントで oceanbase.CDB_TABLES を使用して、テーブルの自動パーティションプロパティを確認できます。
自動パーティションの動作の説明
自動パーティションDDL操作
- パーティションルールの変更:1次パーティションを主キーに基づく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 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE() SIZE('10GB');事前パーティションキーを
col1、分割しきい値を10GBに設定して、自動パーティションテーブルtest1_tbl2を作成します。CREATE TABLE test1_tbl2 (col1 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');事前パーティションキーと分割しきい値を指定せず、自動パーティションテーブル
test1_tbl3を作成します(分割しきい値はデフォルトでauto_split_tablet_sizeの値を使用します)。CREATE TABLE test1_tbl3 (col1 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE();事前パーティションキーを
col1, col2、分割しきい値を10GBに設定し、事前にパーティションポイントP0、P1、P2、P3を作成して、自動パーティションテーブルtest1_tbl4を作成します。CREATE TABLE test1_tbl4 (col1 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE COLUMNS(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 TABLE_SCHEMA, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM information_schema.TABLES WHERE TABLE_NAME LIKE "test1%" ORDER BY TABLE_NAME;実行結果は次のとおりです:
+--------------+------------+------------+------------------------+ | TABLE_SCHEMA | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +--------------+------------+------------+------------------------+ | db_test | test1_tbl1 | TRUE | 10737418240 | | db_test | test1_tbl2 | TRUE | 10737418240 | | db_test | test1_tbl3 | TRUE | 134217728 | | db_test | test1_tbl4 | TRUE | 10737418240 | +--------------+------------+------------+------------------------+ 4 rows in set
例2:テーブルの自動パーティションプロパティを変更する
自動パーティションテーブル
test2_tbl1を作成し、プリパーティションキーをcol1、スプリットしきい値を10GBに指定します。CREATE TABLE test2_tbl1 (col1 INT, col2 INT, col3 VARCHAR(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に指定します。また、パーティションポイントp0(値が100未満の行)、p1(値が100以上かつ200未満の行)、およびp_max(値が200以上の行)を事前に作成します。CREATE TABLE test2_tbl2 (col1 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) 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_tbl2の自動パーティションしきい値を5GBに変更し、事前に作成されたパーティションポイントをp0(値が300未満の行)とp_max(値が300以上の行)に変更します。ALTER TABLE test2_tbl2 PARTITION BY RANGE(col1) SIZE('5GB') (PARTITION p0 VALUES LESS THAN(300), PARTITION p_max VALUES LESS THAN (MAXVALUE));自動パーティションテーブル
test2_tbl3を作成し、プリパーティションキーをcol1、スプリットしきい値を10GBに指定します。CREATE TABLE test2_tbl3 (col1 INT, col2 INT, col3 VARCHAR(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 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE(col1) SIZE('10GB');テーブル
test2_tbl4のプリパーティションキーをcol1からcol1,col2に変更します。ALTER TABLE test2_tbl4 PARTITION BY RANGE COLUMNS(col1,col2) SIZE('10GB');非自動パーティションテーブル
test2_tbl5を作成します。CREATE TABLE test2_tbl5 (col1 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2));SIZE句を指定せずに、テーブルtest2_tbl5を自動パーティションテーブルに変更すると、スプリットしきい値はデフォルトでauto_split_tablet_sizeの値が使用されます。ALTER TABLE test2_tbl5 PARTITION BY RANGE COLUMNS(col1);テーブルの自動パーティションプロパティを確認します。
SELECT TABLE_SCHEMA, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM information_schema.TABLES WHERE TABLE_NAME LIKE "test2%" ORDER BY TABLE_NAME;実行結果は次のとおりです:
+--------------+------------+------------+------------------------+ | TABLE_SCHEMA | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +--------------+------------+------------+------------------------+ | db_test | test2_tbl1 | TRUE | 1073741824 | | db_test | test2_tbl2 | TRUE | 5368709120 | | db_test | test2_tbl3 | FALSE | 0 | | db_test | test2_tbl4 | TRUE | 10737418240 | | db_test | 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 ();実行結果は次のとおりです:
ERROR 1235 (0A000): auto partitioned table without primary key is not supportedテーブルの自動パーティションプロパティを確認します。
SELECT TABLE_SCHEMA, TABLE_NAME, AUTO_SPLIT, AUTO_SPLIT_TABLET_SIZE FROM information_schema.TABLES WHERE TABLE_NAME LIKE "test3%" ORDER BY TABLE_NAME;実行結果は次のとおりです:
+--------------+------------+------------+------------------------+ | TABLE_SCHEMA | TABLE_NAME | AUTO_SPLIT | AUTO_SPLIT_TABLET_SIZE | +--------------+------------+------------+------------------------+ | db_test | test3_tbl1 | TRUE | 134217728 | | db_test | test3_tbl2 | TRUE | 134217728 | | db_test | test3_tbl3 | TRUE | 1073741824 | | db_test | test3_tbl4 | FALSE | 0 | | db_test | 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;