OceanBaseデータベースのパーティション交換機能は、主にパーティションテーブルへのデータの高速インポートを実現し、データの効率的なロードを目的としています。具体的には、フルダンプによるバックアップと復元方式ではなく、フルロード方式で新規作成した非パーティションテーブルへデータを高速にインポートした後、パーティション交換機能を利用してそのデータをパーティションテーブルへ高速に移行することで、既存のパーティションテーブルに対する増分データのインポート性能を向上させます。
パーティション交換機能を増分ロードの代替手段として使用することを推奨します。例えば、パーティション交換機能を利用してパーティションテーブルAの増分データをインポートする場合、具体的な手順は以下の通りです:
- テーブルA上に新しい空のパーティションPを作成します。
- テーブルAと同じ構造を持つ非パーティションテーブルBを作成し、そのテーブルBに増分データをロードします。
- パーティション交換機能を利用して、テーブルAの新しいパーティションPとテーブルBを交換します。
パーティション交換のサポート状況
パーティション交換のサポート状況は以下の表に示されています。タイプ列はターゲットテーブル(target_partition_table_name)を、タイプ行はソーステーブル(origin_table_name)を表します。
| タイプ | パーティションなしのテーブル | 1次パーティションテーブル | 2次パーティションテーブル |
|---|---|---|---|
| 1次パーティションテーブル | サポート | サポートしない | サポートしない |
| 2次パーティションテーブルの1次パーティション | サポートしない | サポート | サポートしない |
| 2次パーティションテーブルの2次パーティション | サポート | サポートしない | サポートしない |
制限事項と注意点
データ検証はサポートされていません。つまり、
WITHOUT VALIDATIONを明示的に指定する必要があります。ユーザー自身が交換データの有効性を保証する必要があります。パーティションテーブルと非パーティションテーブルのテーブルレベルおよび列レベルのプロパティは、それぞれ対応する必要があります。
パーティションテーブルと非パーティションテーブルの制約要件は完全に同じであり、現在のバージョンでは両テーブル間に外部キー制約を設定することはサポートされていません。
パーティションテーブルのローカルインデックステーブルと非パーティションテーブルのインデックステーブルは、それぞれ対応する必要があります。
INCLUDING INDEXESの動作のみがサポートされています(OracleモードではINCLUDING INDEXESを明示的に指定する必要があります)。ローカルインデックスに対応するパーティションのデータも交換に参加し、ローカルインデックスは交換後に交換前の可用状態を維持します。UPDATE GLOBAL INDEXESはサポートされていないため、グローバルインデックスは交換成功後もUnusable状態(無効な状態)となります。現在のパーティション交換機能は、増分ロード導入の一時的な代替としてのみ推奨されます。増分ロード導入の詳細については、ロード導入の概要を参照してください。
一級パーティションテーブルと非パーティションテーブルでデータを交換する場合:
一級パーティションはRange/Listパーティションである必要があります。
説明
V4.3.5バージョンで、V4.3.5 BP5バージョンから始めて、一級パーティションがListパーティションであることがサポートされています。
二級パーティションテーブルの二級パーティションと非パーティションテーブルでデータを交換する場合:
- 一級パーティションのタイプには特に制限はありませんが、二級パーティションは必ずRangeパーティションである必要があります。
二級パーティションテーブルの一級パーティションと一級パーティションテーブルでデータを交換する場合:
target_partition_table_nameは二級パーティションテーブルでなければなりません。交換するパーティションは、このテーブルのいずれかの一級パーティション名である必要があります。また、この二級パーティションテーブルの一級パーティションはRange/Listパーティションである必要があります。origin_table_nameは一級パーティションテーブルでなければならず、そのパーティションタイプは交換用の一級パーティション以下の二級パーティションと完全に一致している必要があります。- 一二級パーティションテーブルを交換した後、関連するテーブルの統計情報は無効になります。再収集が必要です。
構文
ALTER TABLE target_partition_table_name
EXCHANGE {PARTITION partition_name
| SUBPARTITION subpartition_name}
WITH TABLE origin_table_name
INCLUDING INDEXES
WITHOUT VALIDATION;
パラメータの説明
| パラメータ | 説明 |
|---|---|
| target_partition_table_name | パーティション交換におけるターゲットパーティションテーブル名を示します。 |
| PARTITION partition_name | パーティション交換におけるターゲットパーティションテーブルのパーティション名を指定します。 |
| SUBPARTITION subpartition_name | パーティション交換におけるターゲットパーティションテーブルのサブパーティション名を指定します。
説明OceanBaseデータベースV4.3.5では、V4.3.5 BP3以降のバージョンから |
| origin_table_name | パーティション交換におけるソーステーブル名を示し、パーティション化されていないテーブルまたは1次パーティションテーブルです。
説明OceanBaseデータベースV4.3.5では、V4.3.5 BP3以降のバージョンから、サブパーティションテーブルの1次パーティションと1次パーティションテーブル間でのデータ交換がサポートされています。 |
使用方法
現在のパーティション交換機能は、パーティションテーブルの1つのパーティションと非パーティションテーブル間でデータを交換するものであり、主に増分ダイレクトロード機能の一時的な代替ツールとして使用されます。パーティションテーブルと非パーティションテーブルの一般的な特徴は以下の通りです:
- パーティションテーブル(partitioned table):履歴データを含むパーティションテーブルで、通常データ量が大きいです。
- 非パーティションテーブル(non-partitioned table):増分データを含みます。
パーティション交換機能を使用する際には非常に慎重に行う必要があります。不適切な操作により、データが元のテーブルのパーティションキーの条件を満たさなくなる可能性があり、連鎖的なエラーが発生する恐れがあります。そのため、パーティション交換を実行する際には、以下の手順に従ってパーティションテーブルと非パーティションテーブルがパーティション交換を実行できるかどうかを判断する必要があります。
SHOW CREATE TABLEステートメントを使用して、パーティションテーブルのパーティションキーおよびターゲットパーティション情報を照会します。また、非パーティションテーブルのデータを照会し、非パーティションテーブルのデータがターゲットパーティションのパーティションキーのデータ範囲要件を満たしているかどうかを確認します。ここで、
table_nameは照会対象のテーブル名です。SHOW CREATE TABLE table_name;照会結果に基づいて、パーティションテーブルと非パーティションテーブルが上記の制限事項と注意点を満たしていることを確認します。
パーティション交換を行う前に、以下の条件が要求に適合していることを少なくとも確認する必要があります。
プロパティ 必要 同じテナントかどうか はい 同じスキーマかどうか はい 同一テーブルグループ(TableGroup)かどうか はい 同一テーブルスペース(TableSpace)かどうか はい 使用する文字セットフォーマットが一致しているか はい テーブルタイプが一致しているか はい。いずれもユーザーテーブルである必要があります。つまり、 USER_TABLE主キーの数が一致しているか はい レコードストレージ形式が一致しているか はい カラム形式とカラムの相対順序が一致しているか はい すべて自動インクリメント列か はい カラムのデフォルト値、生成リスト式が一致しているか はい 暗号化方式が一致しているか はい カラムストア形式が一致しているか はい インデックス形式、状態、数が一致しているか はい。パーティションテーブルのローカルインデックスは、パーティションなしのテーブルのインデックスと1対1で対応付けなければなりません インデックステーブル名が一致しているか いいえ コンストRAINT形式、含む列が一致しているか はい パーティション交換の構文を使用してパーティション交換を実行します。交換後、パーティションテーブルの指定されたパーティションのデータは非パーティションテーブルに移動し、非パーティションテーブルのデータはパーティションテーブルの指定されたパーティションに移動します。パーティションテーブルのグローバルインデックス状態はUnusableとなります。
例
例1:範囲パーティションテーブルと非パーティションテーブル間のデータ交換
范囲パーティションテーブルと非パーティションテーブル間のデータ交換。
范囲パーティションテーブル
tbl1_rを作成します。obclient> CREATE TABLE tbl1_r (col1 INT PRIMARY KEY, col2 VARCHAR2(50)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(10), PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(30) );非パーティションテーブル
tbl1を作成します。obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR2(50));テーブル
tbl1にデータを挿入します。obclient> INSERT INTO tbl1 VALUES(1, 'a1'),(2, 'a2');実行結果は次のとおりです:
Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0パーティションテーブル
tbl1_rのパーティションp0と非パーティションテーブルtbl1のパーティション交換を実行します。obclient> ALTER TABLE tbl1_r EXCHANGE PARTITION p0 WITH TABLE tbl1 INCLUDING INDEXES WITHOUT VALIDATION;パーティションテーブル
tbl1_rのパーティションp0のデータを確認します。obclient> SELECT * FROM tbl1_r PARTITION(p0);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | a1 | | 2 | a2 | +------+------+ 2 rows in set
リストパーティションテーブルと非パーティションテーブル間のデータ交換。
リストパーティションテーブル
tbl1_lを作成します。obclient> CREATE TABLE tbl1_l (col1 INT, col2 VARCHAR(50), col3 INT) PARTITION BY LIST(col3) (PARTITION p0 VALUES (1, 2, 3, 4), PARTITION p1 VALUES (5, 6, 7, 8, 9), PARTITION p2 VALUES (DEFAULT) );非パーティションテーブル
tbl1_2を作成します。obclient> CREATE TABLE tbl1_2 (col1 INT, col2 VARCHAR(50), col3 INT);テーブル
tbl1_2にデータを挿入します。obclient> INSERT INTO tbl1_2 VALUES(1, 'a1', 1), (2, 'a2', 2), (3, 'a3', 3), (4, 'a4', 4), (5, 'a5', 5);実行結果は次のとおりです:
Query OK, 5 rows affected Records: 5 Duplicates: 0 Warnings: 0パーティションテーブル
tbl1_lのパーティションp0と非パーティションテーブルtbl1_2のパーティション交換を実行します。obclient> ALTER TABLE tbl1_l EXCHANGE PARTITION p0 WITH TABLE tbl1_2 INCLUDING INDEXES WITHOUT VALIDATION;パーティションテーブル
tbl1_lのパーティションp0のデータを確認します。obclient> SELECT * FROM tbl1_l PARTITION(p0);実行結果は次のとおりです:
+------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | a1 | 1 | | 2 | a2 | 2 | | 3 | a3 | 3 | | 4 | a4 | 4 | | 5 | a5 | 5 | +------+------+------+ 5 rows in set
例2:サブパーティションテーブルのパーティションとパーティションテーブルのパーティション間でデータを交換する
Range + Hash型のサブパーティションテーブル
tbl2_rhを作成します。obclient> CREATE TABLE tbl2_rh (col1 INT PRIMARY KEY, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY HASH(col1) SUBPARTITIONS 5 (PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20), PARTITION p2 VALUES LESS THAN (30), PARTITION p3 VALUES LESS THAN (MAXVALUE) );Hash型のパーティションテーブル
tbl2_hを作成します。obclient> CREATE TABLE tbl2_h (col1 INT PRIMARY KEY, col2 INT) PARTITION BY HASH(col1) PARTITIONS 5;テーブル
tbl2_rhにデータを挿入します。obclient> INSERT INTO tbl2_rh VALUES(11, 30), (14, 40), (26, 150), (29, 160);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0パーティションテーブル
tbl2_rhのパーティションp1のデータを確認します。obclient> SELECT * FROM tbl2_rh PARTITION(p1);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 11 | 30 | | 14 | 40 | +------+------+ 2 rows in setテーブル
tbl2_hにデータを挿入します。obclient> INSERT INTO tbl2_h VALUES(12, 20), (16, 110), (17, 170), (19, 120);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0サブパーティションテーブル
tbl2_rhのパーティションp1とパーティションテーブルtbl2_hのパーティションを交換します。obclient> ALTER TABLE tbl2_rh EXCHANGE PARTITION p1 WITH TABLE tbl2_h INCLUDING INDEXES WITHOUT VALIDATION;パーティションテーブル
tbl2_rhのパーティションp1のデータを確認します。obclient> SELECT * FROM tbl2_rh PARTITION(p1);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 19 | 120 | | 12 | 20 | | 16 | 110 | | 17 | 170 | +------+------+ 4 rows in set
例3:サブパーティションテーブルのサブパーティションとパーティションテーブル間のデータ交換
Range + Range型のサブパーティションテーブル
tbl3_rrを作成します。obclient> CREATE TABLE tbl3_rr(col1 INT, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(10) (SUBPARTITION sp0 VALUES LESS THAN(20), SUBPARTITION sp1 VALUES LESS THAN(50), SUBPARTITION sp2 VALUES LESS THAN (MAXVALUE) ), PARTITION p1 VALUES LESS THAN(20) (SUBPARTITION sp3 VALUES LESS THAN(20), SUBPARTITION sp4 VALUES LESS THAN(50), SUBPARTITION sp5 VALUES LESS THAN (MAXVALUE) ) );パーティションテーブル
tbl3を作成します。obclient> CREATE TABLE tbl3 (col1 INT, col2 INT);テーブル
tbl3_rrにデータを挿入します。obclient> INSERT INTO tbl3_rr VALUES(1, 30), (4, 40), (16, 150), (19, 160);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0パーティションテーブル
tbl3_rrのパーティションsp1のデータを確認します。obclient> SELECT * FROM tbl3_rr PARTITION(sp1);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | 30 | | 4 | 40 | +------+------+ 2 rows in setテーブル
tbl3にデータを挿入します。obclient> INSERT INTO tbl3 VALUES(2, 21), (6, 30), (7, 35), (9, 40);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0パーティションテーブル
tbl3_rrのパーティションsp1とパーティションテーブルtbl3間でパーティション交換を実行します。obclient> ALTER TABLE tbl3_rr EXCHANGE SUBPARTITION sp1 WITH TABLE tbl3 INCLUDING INDEXES WITHOUT VALIDATION;パーティションテーブル
tbl3_rrのパーティションsp1のデータを確認します。obclient> SELECT * FROM tbl3_rr PARTITION(sp1);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 2 | 21 | | 6 | 30 | | 7 | 35 | | 9 | 40 | +------+------+ 4 rows in set