ビジネスニーズに応じて、パーティションテーブルのデータを削除し、パーティション構造を保持することができます。
パーティションテーブルにおけるTruncateパーティション操作のサポート状況
OceanBaseデータベースのOracleモードでは:
パーティションテーブルについては、現在RangeパーティションとListパーティションに対してのみTruncateパーティション操作をサポートしており、Hashパーティションに対するサポートはありません。
サブパーティションテーブルについては、現在Range/Listタイプ(組み合わせ)のパーティションに対してのみTruncateパーティション操作をサポートしています。
OceanBaseデータベースのOracleモードにおける、パーティションテーブルとサブパーティションテーブルのTruncateパーティション操作に対するサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
Truncate パーティション |
Truncate サブパーティション |
|---|---|---|---|
| パーティションテーブル | Range / List | サポート | - |
| パーティションテーブル | Hash | サポートなし | - |
| サブパーティションテーブル | Range + Range / Range + List | サポート | サポート |
| サブパーティションテーブル | Range + Hash | サポート | サポートなし |
| サブパーティションテーブル | List + Range / List + List | サポート | サポート |
| サブパーティションテーブル | List + Hash | サポート | サポートなし |
| サブパーティションテーブル | Hash + Range / Hash + List | サポートなし | サポート |
| サブパーティションテーブル | Hash + Hash | サポートなし | サポートなし |
Truncateパーティション操作の説明
Truncateパーティションを実行する際は、Truncate対象のパーティションにアクティブなトランザクションやクエリが存在しないようにしてください。存在する場合、SQL文がエラーになったり、異常が発生したりする可能性があります。sysテナントで、oceanbase.GV$OB_TRANSACTION_PARTICIPANTSビューを参照することで、現在終了していないトランザクションのコンテキスト状態を確認できます。
Truncateパーティションがグローバルインデックスに与える影響
Oracleモードでは、グローバルインデックスを持つパーティションテーブルまたはサブパーティションテーブルに対してTruncateパーティションを実行する際、ALTER TABLEステートメントにUPDATE GLOBAL INDEXESキーワードを追加してグローバルインデックス情報を更新する必要があります。UPDATE GLOBAL INDEXESキーワードを追加しない場合、Truncateパーティション後、そのパーティションテーブル上のグローバルインデックスは使用不可状態になります。
Range、Interval、またはListパーティション(パーティションおよびサブパーティションを含む)を使用し、TRUNCATEパーティション操作をサポートするテーブルについて、UPDATE GLOBAL INDEXESを指定した場合、システムはグローバルインデックスを再構築せず、バックグラウンドでのメジャーコンパクションによるデータ削除を通じて、遅延(lazy)メンテナンス戦略でインデックスの有効性を維持します。これにより、インデックスの無効化によるクエリの中断やパフォーマンスの低下を回避できます。ただし、この最適化は通常のグローバルインデックスにのみ適用されます。以下のシナリオでは、この最適化はトリガーされません:
- パーティションがHashパーティションである場合(サブパーティションがRangeまたはListであっても)、サブパーティションに対してTruncate操作を実行する場合。
- パーティションキーが通常の列ではなく式である場合。
説明
V4.4.2バージョンでは、V4.4.2 BP1バージョンから INTERVAL パーティションテーブルが UPDATE GLOBAL INDEXES 構文をサポートしています。
パーティション DDL時のグローバルインデックス動作を制御する隠れたパラメータ
V4.3.5バージョンから、OceanBaseデータベースはV4.3.5 BP2バージョン以降、テナントレベルの隠れたパラメータ _ob_enable_truncate_partition_preserve_global_index を導入しました。このパラメータは、TRUNCATE/DROP でメインテーブルのパーティション(以下、パーティションDDLと略)を実行する際に、グローバルインデックスを無効にしないかどうかを制御します。アップグレードされたテナントの場合、この隠れたパラメータのデフォルト値は False です。新規テナントの場合、デフォルト値は True です。値の動作比較は以下の通りです:
パラメータ値 |
パーティションDDL実行中の動作 |
パーティションDDL実行後の結果 |
|---|---|---|
| True | TRUNCATE/DROP のメインテーブルパーティションのみDMLを許可せず、メインテーブルの他のパーティションは通常通りDML可能。 |
グローバルインデックスは無効にならない:メインテーブルとすべてのインデックステーブルでDML操作を実行でき、メインテーブルに関連するグローバルインデックスは無効にならない。 |
| False | TRUNCATE/DROP のメインテーブルパーティションのみDMLを許可せず、メインテーブルの他のパーティションは通常通りDML可能。 |
グローバルインデックスは無効になる:メインテーブルとすべてのインデックステーブルでDML操作を実行できるが、メインテーブルに関連するグローバルインデックスは無効になるか、再構築される。 |
例:
インデックスは維持されます。
obclient> ALTER SYSTEM SET "_ob_enable_truncate_partition_preserve_global_index" = True;インデックスは無効になります。
obclient> ALTER SYSTEM SET "_ob_enable_truncate_partition_preserve_global_index" = False;
Truncateパーティションが並行DDL/DML/クエリに与える影響
TruncateパーティションはOffline DDL操作に属します。Truncateパーティションを実行する際、OceanBaseデータベースは対象パーティションにパーティションレベルの排他的ロックを設定します。
操作タイプ |
Truncateパーティション実行中の影響 |
|---|---|
| 並行DDL | 禁止またはブロックされます。同一テーブルに対する他の任意のDDL操作は同時に実行できません。 |
| 並行DML |
|
並行クエリ(SELECT) |
影響を受けず、正常に実行できます。 |
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