ビジネスニーズに応じて、パーティションテーブルのデータを削除し、パーティション構造は保持することができます。
パーティションテーブルにおけるTRUNCATEパーティション操作のサポート状況
OceanBaseデータベースのOracleモードでは:
パーティションテーブルについては、現在、RANGEパーティションとLISTパーティションに対してのみTRUNCATEパーティション操作をサポートしており、HASHパーティションに対するサポートは現在提供されていません。
サブパーティションテーブルについては、現在、RANGEまたはLISTタイプ(組み合わせ)のパーティションに対してのみTRUNCATEパーティション操作をサポートしています。
OceanBaseデータベースのOracleモードにおける、パーティションテーブルとサブパーティションテーブルのTRUNCATEパーティション操作に関するサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
Truncate 1次パーティション |
Truncate 2次パーティション |
|---|---|---|---|
| 1次パーティションテーブル | Range / List | サポート | - |
| 1次パーティションテーブル | Hash | サポートなし | - |
| 2次パーティションテーブル | Range + Range / Range + List | サポート | サポート |
| 2次パーティションテーブル | Range + Hash | サポート | サポートなし |
| 2次パーティションテーブル | List + Range / List + List | サポート | サポート |
| 2次パーティションテーブル | List + Hash | サポート | サポートなし |
| 2次パーティションテーブル | Hash + Range / Hash + List | サポートなし | サポート |
| 2次パーティションテーブル | Hash + Hash | サポートなし | サポートなし |
Truncateパーティション操作の説明
Truncateパーティション操作を実行する前に、以下の情報を理解しておく必要があります:
Truncateパーティションする際は、Truncate対象のパーティションにアクティブなトランザクションやクエリが存在しないようにしてください。存在すると、SQLステートメントでエラーが発生したり、異常が発生したりする可能性があります。
sysテナントで、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。Oracleモードでは、グローバルインデックスを持つパーティションまたはサブパーティションテーブルをTruncateする場合、
ALTER TABLEステートメントにUPDATE GLOBAL INDEXESキーワードを追加してグローバルインデックス情報を更新する必要があります。UPDATE GLOBAL INDEXESキーワードを追加しない場合、Truncate後のそのパーティションテーブルのグローバルインデックスは使用できなくなります。Range、Interval、またはListパーティション(パーティションおよびサブパーティションを含む)を使用し、
TRUNCATEパーティション操作をサポートするテーブルについて、UPDATE GLOBAL INDEXESを指定すると、システムはグローバルインデックスを再構築せず、バックグラウンドでのメジャーコンパクションによるデータ削除を通じて、遅延(lazy)メンテナンス戦略でインデックスの有効性を維持します。これにより、インデックスの無効化によるクエリの中断やパフォーマンスの低下を回避できます。ただし、この最適化は通常のグローバルインデックスにのみ適用されます。以下のシナリオでは、この最適化はトリガーされません:- パーティションがHashパーティションである場合(サブパーティションがRangeまたはListであっても)。
- パーティションキーが通常の列ではなく式である場合。
- フルテキストインデックス、非構造化型などの特殊なグローバルインデックスの場合。
UPDATE GLOBAL INDEXESを使用しても、インデックスは使用できなくなります。
説明
V4.4.2バージョンでは、V4.4.2 BP1バージョンから INTERVAL パーティションテーブルが UPDATE GLOBAL INDEXES 構文をサポートしています。
パーティションのTRUNCATE
ビジネスニーズに応じて、パーティションテーブルまたはサブパーティションテーブルのパーティションをTRUNCATEできます。
構文
ALTER TABLE table_name TRUNCATE PARTITION partition_name_list [UPDATE GLOBAL INDEXES];
partition_name_list:
partition_name [, partition_name ...]
説明
パーティションをTRUNCATEする場合、1つまたは複数のパーティションのデータを削除できます。
サブパーティションテーブル内のパーティションをTRUNCATEすると、そのパーティションおよび対応するサブパーティションのデータがすべて削除されます。
例
パーティションテーブル
tbl1_rのM202001およびM202002パーティションのデータを削除し、グローバルインデックス情報を更新します。obclient> CREATE TABLE tbl1_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) , PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD')) , PARTITION M202007 VALUES LESS THAN(TO_DATE('2020/08/01','YYYY/MM/DD')) , PARTITION M202008 VALUES LESS THAN(TO_DATE('2020/09/01','YYYY/MM/DD')) , PARTITION M202009 VALUES LESS THAN(TO_DATE('2020/10/01','YYYY/MM/DD')) , PARTITION M202010 VALUES LESS THAN(TO_DATE('2020/11/01','YYYY/MM/DD')) , PARTITION M202011 VALUES LESS THAN(TO_DATE('2020/12/01','YYYY/MM/DD')) , PARTITION M202012 VALUES LESS THAN(TO_DATE('2021/01/01','YYYY/MM/DD')) , PARTITION MMAX VALUES LESS THAN (MAXVALUE) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r TRUNCATE PARTITION M202001,M202002 UPDATE GLOBAL INDEXES; Query OK, 0 rows affectedRange + Listパーティションのサブパーティションテーブル
t2_f_rlのパーティションp0およびp1を削除します。obclient> ALTER TABLE t2_f_rl TRUNCATE PARTITION p0,p1;
サブパーティションのTRUNCATE
ビジネスニーズに応じて、サブパーティションテーブル内のサブパーティションをTRUNCATEできます。
構文
ALTER TABLE table_name TRUNCATE SUBPARTITION subpartition_name_list[ UPDATE GLOBAL INDEXES ];
subpartition_name_list:
subpartition_name[, subpartition_name ...]
説明
サブパーティションをTRUNCATEする際、1つまたは複数のサブパーティションのデータをすべて削除できます。
例
パーティションテーブルt2_f_lrのパーティションp1配下のサブパーティションsp3とsp4を削除し、グローバルインデックス情報を更新します。
obclient> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50))
PARTITION BY RANGE(col1)
SUBPARTITION BY LIST(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES('01'),
SUBPARTITION sp1 VALUES('02')
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES('01'),
SUBPARTITION sp3 VALUES('02'),
SUBPARTITION sp4 VALUES('03')
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t2_f_rl TRUNCATE SUBPARTITION sp3,sp4 UPDATE GLOBAL INDEXES;
Query OK, 0 rows affected