ビジネスニーズに応じて、パーティションテーブルからパーティションを削除できます。
パーティションテーブルにおけるパーティション削除操作のサポート状況
OceanBaseデータベースのMySQLモードでは、パーティションテーブルとサブパーティションテーブルにおけるパーティション削除操作のサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
パーティションの削除 |
サブパーティションの削除 |
|---|---|---|---|
| パーティションテーブル |
|
サポート | - |
| パーティションテーブル |
|
サポートなし | - |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
パーティション削除操作の説明
パーティション削除がグローバルインデックスに与える影響
Range/Range Columns、List/List Columnsのパーティション(パーティションとサブパーティションの両方を含む)を使用し、かつパーティション削除操作をサポートするテーブルについて、システムはグローバルインデックスを再構築せず、バックグラウンドでのメジャーコンパクションによるデータ削除を通じて遅延(lazy)メンテナンス戦略を維持し、インデックスの無効化によるクエリの中断やパフォーマンスの低下を回避します。ただし、この最適化は通常のグローバルインデックスにのみ適用されます。以下のシナリオでは、この最適化はトリガーされません:
- パーティションがHashパーティションである場合(サブパーティションがRange/Range Columns、List/List Columnsであっても)。
- パーティションキーが通常の列ではなく式である場合。
パーティション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/クエリに与える影響
パーティションの削除はオフラインDDL操作に属します。パーティションを削除する際、OceanBaseデータベースは対象パーティションにパーティションレベルの排他的ロックを設定します。
操作タイプ |
パーティション削除実行中の影響 |
|---|---|
| 並行DDL | 禁止またはブロックされます。同一テーブルに対する他のすべてのDDL操作は同時に実行できません。 |
| 並行DML |
|
並行クエリ(SELECT) |
影響を受けず、正常に実行できます。 |
パーティションの削除
Rangeパーティション、Range Columnsパーティション、Listパーティション、およびList Columnsパーティションなどのパーティションテーブルからパーティションを削除できます。HashパーティションとKeyパーティションタイプのパーティションテーブルは、現在パーティションの削除をサポートしていません。
パーティションを削除するSQL構文は以下のとおりです:
ALTER TABLE table_name DROP PARTITION partition_name[, partition_name ...];
説明
パーティションを削除する場合、1つまたは複数のパーティションを削除できますが、すべてのパーティションを削除することはできません。
パーティションを削除する際は、そのパーティション上にアクティブなトランザクションやクエリが存在しないようにしてください。存在すると、SQLステートメントがエラーになったり、異常が発生したりする可能性があります。
sysテナントでは、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。パーティションを削除すると、そのパーティション内のデータも同時に削除されます。データのみを削除する場合は、
TRUNCATEステートメントを使用できます。サブパーティションテーブルの場合、パーティションを削除すると、そのパーティションの定義および対応するサブパーティションとデータも同時に削除されます。
一部の例は以下のとおりです:
パーティションテーブル
tbl1_rからM202011およびM202012パーティションを削除します。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 DROP PARTITION M202011,M202012; Query OK, 0 rows affectedRange Columns + Range Columnsのテンプレート型パーティションテーブル
t_m_rcrcから、パーティションp1とp2を削除します。obclient> CREATE TABLE t_m_rcrc(col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(1000), SUBPARTITION mp1 VALUES LESS THAN(2000), SUBPARTITION mp2 VALUES LESS THAN(3000) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) ); Query OK, 0 rows affected obclient> ALTER TABLE t_m_rcrc DROP PARTITION p1,p2; Query OK, 0 rows affectedRange + Rangeの非テンプレート型パーティションテーブル
t_f_rrから、パーティションp1を削除します。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 DROP PARTITION p1; Query OK, 0 rows affected
サブパーティションの削除
サブパーティションを削除するSQL構文は以下のとおりです:
ALTER TABLE table_name DROP SUBPARTITION subpartition_name[, subpartition_name ...];
説明
サブパーティションテーブル内のサブパーティションを削除する際は、そのパーティションにアクティブなトランザクションやクエリが存在しないようにしてください。存在する場合、SQLステートメントがエラーになったり、異常が発生したりする可能性があります。
sysテナントでは、ビューoceanbase.GV$OB_TRANSACTION_PARTICIPANTSを使用して、現在終了していないトランザクションのコンテキスト状態を確認できます。サブパーティションを削除すると、その定義と内部のデータが同時に削除されます。
複数のサブパーティションを削除する場合、これらのサブパーティションはすべて同一のパーティションに属している必要があります。
Range + Rangeの非テンプレート型パーティションテーブルt_f_rrから、サブパーティションsp6とsp7を削除する例を以下に示します:
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 DROP SUBPARTITION sp6,sp7;
Query OK, 0 rows affected