ビジネスニーズに応じて、パーティションテーブルからパーティションを削除できます。パーティションを削除すると、そのパーティションの定義とデータが同時に削除されます。
パーティションテーブルにおけるパーティション削除操作のサポート状況
OceanBaseデータベースのOracleモードでは:
パーティションテーブルについては、現在RangeパーティションとListパーティションのみ削除操作をサポートしており、Hashパーティションの削除操作はサポートされていません。
サブパーティションテーブルについては、現在Range/Listタイプ(組み合わせ)のパーティションのみ削除操作をサポートしています。
OceanBaseデータベースのOracleモードにおける、パーティションテーブルとサブパーティションテーブルのパーティション削除操作のサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
パーティションの削除 |
サブパーティションの削除 |
|---|---|---|---|
| パーティションテーブル | Range / List | サポート | - |
| パーティションテーブル | Hash | サポートなし | - |
| サブパーティションテーブル | Range + Range / Range + List | サポート | サポート |
| サブパーティションテーブル | Range + Hash | サポート | サポートなし |
| サブパーティションテーブル | List + Range / List + List | サポート | サポート |
| サブパーティションテーブル | List + Hash | サポート | サポートなし |
| サブパーティションテーブル | Hash + Range / Hash + List | サポートなし | サポート |
| サブパーティションテーブル | Hash + Hash | サポートなし | サポートなし |
パーティション削除操作の説明
パーティションを削除する際は、削除対象のパーティションにアクティブなトランザクションやクエリが存在しないようにしてください。存在する場合、SQL文がエラーになったり、異常が発生したりする可能性があります。sysテナントで、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。
パーティション削除がグローバルインデックスに与える影響
Oracleモードでは、グローバルインデックスを持つパーティションテーブルまたはサブパーティションテーブルを削除する際、ALTER TABLEステートメントにUPDATE GLOBAL INDEXESキーワードを追加してグローバルインデックス情報を更新する必要があります。UPDATE GLOBAL INDEXESキーワードを追加しない場合、パーティションを削除すると、そのパーティションテーブル上のグローバルインデックスは使用不可状態になります。
Range、Interval、またはListパーティション(パーティションおよびサブパーティションを含む)を使用し、かつパーティション削除操作をサポートするテーブルについて、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;
パーティション削除が並行DDL/DML/クエリに与える影響
パーティションの削除はOffline DDL操作に属します。パーティションを削除する際、OceanBaseデータベースは対象パーティションにパーティションレベルの排他的ロックを設定します。
操作タイプ |
パーティション削除実行中の影響 |
|---|---|
| 並行DDL | 禁止またはブロックされます。同一テーブルに対する他の任意のDDL操作は同時に実行できません。 |
| 並行DML |
|
並行クエリ(SELECT) |
影響を受けず、正常に実行できます。 |
パーティションの削除
ビジネスニーズに応じて、パーティションテーブルまたはサブパーティションテーブルのパーティションを削除できます。
構文
ALTER TABLE table_name DROP PARTITION partition_name_list [UPDATE GLOBAL INDEXES];
partition_name_list:
partition_name [, partition_name ...]
説明
パーティションを削除する場合、1つまたは複数のパーティションを削除できますが、すべてのパーティションを削除することはできません。
パーティションを削除すると、そのパーティション内のデータも削除されます。データのみを削除したい場合は、
TRUNCATEステートメントを使用できます。
例
パーティションテーブル
tbl1_rのパーティションM202005とM202006を削除します。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 DROP PARTITION M202005,M202006; Query OK, 0 rows affectedパーティションテーブル
t2_f_rrのパーティションp0を削除します。obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES LESS THAN(2020), SUBPARTITION sp1 VALUES LESS THAN(2021) ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES LESS THAN(2020), SUBPARTITION sp3 VALUES LESS THAN(2021), SUBPARTITION sp4 VALUES LESS THAN(2022) ) ); Query OK, 0 rows affected obclient> ALTER TABLE t2_f_rr DROP PARTITION p0; Query OK, 0 rows affected
サブパーティションの削除
ビジネスニーズに応じて、サブパーティションテーブル内のサブパーティションを削除できます。サブパーティションを削除すると、その定義とデータが同時に削除されます。
構文
ALTER TABLE table_name DROP SUBPARTITION subpartition_name_list [ UPDATE GLOBAL INDEXES ];
subpartition_name_list:
subpartition_name[, subpartition_name ...]
例
パーティションテーブル t2_f_rr のパーティション p1 内のサブパーティション sp5 と sp6 を削除し、グローバルインデックス情報を更新します。
obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(2020),
SUBPARTITION sp1 VALUES LESS THAN(2021)
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES LESS THAN(2020),
SUBPARTITION sp3 VALUES LESS THAN(2021),
SUBPARTITION sp4 VALUES LESS THAN(2022),
SUBPARTITION sp5 VALUES LESS THAN(2023),
SUBPARTITION sp6 VALUES LESS THAN(2024)
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t2_f_rr DROP SUBPARTITION sp5,sp6 UPDATE GLOBAL INDEXES;
Query OK, 0 rows affected