すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ALTER TABLE DROP SUBPARTITION

最終更新日:Oct 24, 2025

コンポジットパーティションテーブルからサブパーティションとそのデータを削除します。この操作により、サブパーティションのデータは完全に削除されます。この文を実行する前に、サブパーティションのデータがバックアップされているか、または不要であることを確認してください。

概要

ALTER TABLE table_name DROP SUBPARTITION subpartition_name;

パラメーター

パラメーター

必須

説明

table_name

はい

削除するサブパーティションを含むコンポジットパーティションテーブルの名前。

customer_data

subpartition_name

はい

削除するサブパーティションの名前。

p_2022_asia

注意

  • このコマンドを実行するには、テーブルのオーナーまたは特権ユーザーである必要があります。

  • テーブル内の最後のサブパーティションは削除できません。

  • DROP SUBPARTITION は、テーブルレベルの排他ロック AccessExclusiveLock を取得します。このロックは、テーブルに対するすべてのデータ操作言語 (DML) およびほとんどのデータ定義言語 (DDL) 操作をブロックします。この文はオフピーク時に実行し、テーブルに対する他の重大な操作をブロックしないように、完了までに十分な時間を確保してください。

この例では、ストレージ領域を解放するために、2022 年のアジア地域のユーザーデータのサブパーティションを削除します。customer_data テーブルは、登録年 (Range Partitioning) でパーティション化され、地域 (List Subpartitioning) でサブパーティション化された Composite Partitioned Table です。

環境の準備

このステップでは、customer_data という名前のコンポジットパーティションテーブルを作成します。このテーブルは、登録年でレンジパーティション化され、ユーザーの地域でリストサブパーティション化されます。

-- コンポジットパーティションテーブルを作成
CREATE TABLE customer_data (
    customer_id  INT NOT NULL,
    region       VARCHAR2(10),
    reg_date     DATE
)
PARTITION BY RANGE (reg_date)
SUBPARTITION BY LIST (region)
(
    PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION p_2022_asia    VALUES ('Asia'),
        SUBPARTITION p_2022_europe  VALUES ('Europe')
    ),
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION p_2023_asia    VALUES ('Asia'),
        SUBPARTITION p_2023_europe  VALUES ('Europe')
    )
);

-- データを挿入
INSERT INTO customer_data VALUES (101, 'Asia', TO_DATE('2022-06-10', 'YYYY-MM-DD'));
INSERT INTO customer_data VALUES (102, 'Europe', TO_DATE('2022-07-20', 'YYYY-MM-DD'));
INSERT INTO customer_data VALUES (103, 'Asia', TO_DATE('2023-06-10', 'YYYY-MM-DD'));
INSERT INTO customer_data VALUES (104, 'Europe', TO_DATE('2023-07-20', 'YYYY-MM-DD'));

事前チェックの実行

サブパーティションを削除する前に、そのデータをバックアップし、構造を確認します。

-- 重要: サブパーティションを削除する前に、関連データがバックアップされていることを確認してください。

-- サブパーティションの構造をチェックして、p_2022_asia サブパーティションが存在することを確認します。
SELECT SUBPARTITION_NAME 
FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_DATA';

コマンドの実行

DROP SUBPARTITION コマンドを実行して、p_2022_asia サブパーティションを削除します。

ALTER TABLE customer_data DROP SUBPARTITION p_2022_asia;

結果の確認

  1. サブパーティションとそのデータが削除されたことを確認します。

    -- 構造の確認: サブパーティションが削除されたことを確認します。
    SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
    WHERE TABLE_NAME = 'CUSTOMER_DATA';
    -- クエリ結果に p_2022_asia は含まれなくなります。
    
    -- データの確認: サブパーティション内のデータが削除されたことを確認します。
    SELECT COUNT(*) FROM customer_data WHERE customer_id = 101;
    -- クエリ結果は 0 です。
  2. テーブル統計を更新します。

    サブパーティションを削除した後、すぐにテーブルの統計を更新して、クエリオプティマイザーが正確な実行計画を生成できるようにします。

    ANALYZE CUSTOMER_DATA;

よくある質問

Q1: ORA-00942: table or view does not exist エラーが発生するのはなぜですか?

A: このエラーは通常、2 つの理由で発生します: 1) ターゲットテーブルに対する ALTER 権限がない、または 2) テーブル名またはスキーマ名が間違っている。権限設定を確認し、オブジェクト名が正しいことを確認してください。

Q2: ORA-14006: invalid partition name エラーが発生するのはなぜですか?
A: このエラーは、指定されたサブパーティション名が存在しないか、スペルが間違っていることを示します。ALL_TAB_SUBPARTITIONS ビューをクエリして、ターゲットサブパーティションの正しい名前を確認できます。名前が二重引用符で囲まれていない場合、データベースは通常、照合のためにそれを大文字に変換することに注意してください。

Q3: ORA-01031: insufficient privileges エラーが発生するのはなぜですか?
A: このエラーは、ターゲットテーブルに対する ALTER 権限がないために発生します。データベース管理者に連絡して、必要な権限を付与してもらってください。

Q4: DROP SUBPARTITION を実行した後にデータを回復できますか?
A: いいえ。DROP SUBPARTITION はごみ箱をバイパスする物理的な削除です。データを回復する唯一の方法は、操作前に作成されたデータベースバックアップから復元することです。

関連する SQL 文