ビジネスニーズに応じて、パーティションテーブルのデータを削除し、パーティション構造は保持することができます。
パーティションテーブルにおけるTRUNCATEパーティション操作のサポート状況
OceanBaseデータベースのMySQLモードでは、パーティションテーブルとサブパーティションテーブルに対するTRUNCATEパーティション操作のサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
Truncate 1次パーティション |
Truncate 2次パーティション |
|---|---|---|---|
| 1次パーティションテーブル |
|
サポート | - |
| 1次パーティションテーブル |
|
サポートなし | - |
| 2次パーティションテーブル |
|
サポート | サポート |
| 2次パーティションテーブル |
|
サポート | サポートなし |
| 2次パーティションテーブル |
|
サポート | サポート |
| 2次パーティションテーブル |
|
サポート | サポートなし |
| 2次パーティションテーブル |
|
サポート | サポート |
| 2次パーティションテーブル |
|
サポート | サポートなし |
| 2次パーティションテーブル |
|
サポート | サポート |
| 2次パーティションテーブル |
|
サポート | サポートなし |
| 2次パーティションテーブル |
|
サポートなし | サポート |
| 2次パーティションテーブル |
|
サポートなし | サポートなし |
| 2次パーティションテーブル |
|
サポートなし | サポート |
| 2次パーティションテーブル |
|
サポートなし | サポートなし |
Truncateパーティション操作の説明
Range/Range Columns、List/List Columnsパーティション(パーティションおよびサブパーティションを含む)を使用し、TRUNCATE パーティション操作をサポートするテーブルについては、システムはグローバルインデックスを再構築せず、バックグラウンドでのメジャーコンパクションによるデータ削除を通じて、遅延(lazy)メンテナンス戦略でインデックスの有効性を維持します。これにより、インデックスの無効化によるクエリの中断やパフォーマンスの低下を回避できます。ただし、この最適化は通常のグローバルインデックスにのみ適用されます。以下のシナリオでは、この最適化はトリガーされません:
- パーティションがHashパーティションである場合(サブパーティションがRange/Range ColumnsまたはList/List Columnsであっても)。
- パーティションキーが通常の列ではなく式である場合。
- フルテキストインデックスや非構造化型などの特殊なグローバルインデックスの場合、インデックスは使用不可状態となります。
パーティションのTRUNCATE
パーティションテーブル内のパーティションをTRUNCATEできます。
パーティションのTRUNCATEに関するSQL構文は以下のとおりです:
ALTER TABLE table_name TRUNCATE PARTITION partition_name[, partition_name ...];
説明
パーティションをTRUNCATEすると、1つまたは複数のパーティションのデータを削除できます。
パーティションをTRUNCATEする際は、そのパーティション上にアクティブなトランザクションやクエリが存在しないようにしてください。存在すると、SQLステートメントがエラーになったり、異常が発生したりする可能性があります。
sysテナントでは、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。サブパーティションテーブルの場合、パーティションをTRUNCATEすると、1つまたは複数のパーティションおよび対応するサブパーティションのデータがすべて削除されます。
例:
パーティションテーブル
tbl1_rのM202001およびM202002パーティションのデータを削除します。obclient> CREATE TABLE tbl1_r (log_id BIGINT NOT NULL,log_value VARCHAR(50),log_date TIMESTAMP NOT NULL) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) (PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) , PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01')) , PARTITION M202007 VALUES LESS THAN(UNIX_TIMESTAMP('2020/08/01')) , PARTITION M202008 VALUES LESS THAN(UNIX_TIMESTAMP('2020/09/01')) , PARTITION M202009 VALUES LESS THAN(UNIX_TIMESTAMP('2020/10/01')) , PARTITION M202010 VALUES LESS THAN(UNIX_TIMESTAMP('2020/11/01')) , PARTITION M202011 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/01')) , PARTITION M202012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r TRUNCATE PARTITION M202001,M202002; Query OK, 0 rows affectedRange Columns + List Columns パーティションテーブル
t_f_rclcのパーティションp0のデータを削除します。
サブパーティションのTRUNCATE
サブパーティションをTRUNCATEするSQL構文は以下のとおりです:
ALTER TABLE table_name TRUNCATE SUBPARTITION subpartition_name[, subpartition_name ...];
説明
サブパーティションテーブルのサブパーティションをTRUNCATEする際は、そのパーティション上にアクティブなトランザクションやクエリが存在しないようにしてください。存在すると、SQLステートメントがエラーになったり、異常が発生したりする可能性があります。
sysテナントでは、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。複数のサブパーティションをTRUNCATEする場合、これらのサブパーティションはすべて同一のパーティションに属している必要があります。
Range + Rangeパーティションテーブルt_f_rrのサブパーティションsp1とsp2のデータを削除する例を以下に示します:
obclient> CREATE TABLE t_f_rr(col1 INT,col2 TIMESTAMP)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2))
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t_f_rr TRUNCATE SUBPARTITION sp1,sp2;
Query OK, 0 rows affected