OceanBaseデータベースでは、事前に自動パーティション分割ルールを設定し、データ量が一定のレベルに達すると自動的にパーティションの分割処理を実行します。これにより、データの増加に応じてデータベーステーブルを自動的に拡張でき、単一パーティションのデータ量が過大になることによるロードバランシングやパフォーマンスの問題を回避できます。
自動パーティション分割操作のサポート状況
現在のバージョンでは、Range/Range Columnsパーティションのパーティションに主キーテーブルが存在する場合にのみ、自動パーティション機能をサポートしています。
使用上の制限と注意事項
- 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 [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') | オプションです。パーティションの分割しきい値を指定します。値の範囲は[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
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() 内にプリパーティションキー情報を指定すると、スキーマ内の対応するレコードが変更されます。情報を指定しない場合は、既存の設定が維持されます。
注意複数列のパーティションキーに変更する場合は、 |
| SIZE('size_value') | オプションです。テーブルの自動パーティショニングのしきい値を変更します。値の範囲は [1MB, +∞) です。size_value を unlimited に変更しても、既存のパーティションには影響せず、今後新しい自動パーティションの分割はスケジュールされません。
説明V4.4.2 バージョンでは、V4.4.2 BP1 以降、自動パーティション分割のしきい値の下限が 128MB から 1MB に調整されました。 注意テーブルデータ量が多いシナリオでは、 |
| range_partition_list | オプションです。パーティションルールを変更します。SIZE 句を使用せずにパーティション定義を指定した場合、パーティションルールのみが変更され、既存の自動パーティション定義には影響しません。 |
テナントレベルの自動パーティショニング設定
テナントレベルのパラメータ enable_auto_split と auto_split_tablet_size を設定することで、要件を満たすテナント内のテーブルに対して、グローバル設定に基づいてテーブルの自動分割を制御します。CREATE TABLE 時に SIZE 構文を省略した場合、以下のテナントレベルのパラメータに基づいて自動パーティションテーブルを作成するかどうかが決定されます(デフォルトでは主キー列が自動パーティションテーブルのパーティションキーとして使用されます)。
- enable_auto_split:テナントレベルのパラメータで、テナントの自動パーティショニング機能を有効にするかどうかを制御します。
- auto_split_tablet_size:テナントレベルのパラメータで、テナントの自動パーティショニング機能が有効な場合に、分割をトリガーするしきい値を制御します。
SIZE 構文を省略し、かつ enable_auto_split を true に設定した場合、分割制限に合致するテーブルにのみ自動パーティションが設定され、制限に合致しないテーブルには適用されません。例えば、サブパーティションテーブル、非Rangeパーティションテーブル、主キーのないテーブル、またはパーティションキーと主キーのプレフィックスが一致しないパーティションテーブルを作成すると、通常は非自動パーティションテーブルとして作成されます(ユーザーが手動で自動分割の特別な構文を記述した場合でもエラーが発生します)。
説明
ビュー information_schema.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 INT, col2 INT, col3 VARCHAR(30), PRIMARY KEY(col1, col2)) PARTITION BY RANGE() SIZE('10GB');自動パーティションテーブル
test1_tbl2を作成し、プリパーティションキーをcol1に、分割しきい値を10GBに設定します。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();自動パーティションテーブル
test1_tbl4を作成する際、プリパーティションキーをcol1, col2に、分割しきい値を10GBに設定し、事前にパーティションマーカーP0、P1、P2、P3を作成します。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パーティションを自動使用するよう設定されているため、通常のテーブル作成構文は自動的に自動パーティションを行い、テナントレベルのパラメータを読み取ります。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 ();実行結果は次のとおりです:
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;