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

PolarDB:ALTER TABLE TRUNCATE SUBPARTITION

最終更新日:Oct 24, 2025

複合パーティションテーブル内の指定されたサブパーティションからすべてのデータを削除します。この操作はデータを完全に削除しますが、サブパーティションの構造は保持します。このコマンドを実行する前に、データが不要であるか、バックアップされていることを確認してください。

概要

ALTER TABLE table_name 
  TRUNCATE SUBPARTITION subpartition_name 
  [{DROP|REUSE} STORAGE]

パラメーター

パラメーター

必須

説明

table_name

はい

ターゲットの複合パーティションテーブルの名前。

customer_data

subpartition_name

はい

切り捨てるサブパーティションの名前。

p_2022_asia

{DROP|REUSE} STORAGE

いいえ

この句は Oracle 構文との互換性のために解析されますが、無視され、ストレージには影響しません。

DROP STORAGE/

REUSE STORAGE

注意

  • テーブルのオーナーであるか、テーブルに対する ALTER 権限を持っている必要があります。

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

  • DDL 操作として、TRUNCATE SUBPARTITION は現在のトランザクションを暗黙的にコミットします。コマンドが実行された後、削除されたデータは ROLLBACK を使用して回復することはできません。この操作を実行する前にデータをバックアップしてください。

  • TRUNCATE SUBPARTITION は、ファイルの削除を含むメタデータ操作です。数億のレコードを持つテーブルであっても、数秒で完了できます。I/O、CPU、およびメモリのオーバーヘッドは非常に低いです。

この例では、2022 年のアジア地域のユーザーデータのサブパーティションからデータを削除する方法を示します。この例では、登録年 (RANGE) とユーザーリージョン (LIST) によって複合パーティション化された顧客テーブルを使用します。

環境の準備

このステップでは、customer_data という名前の複合パーティションテーブルを作成します。テーブルは登録年 (p_2022) によってレンジパーティション化され、次にユーザーリージョン (p_2022_asia および p_2022_europe) によってリストサブパーティション化されます。その後、テストデータがこれら 2 つのサブパーティションに挿入されます。

-- 複合パーティションテーブルを作成する
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')
    )
);

-- データを挿入する
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'));

事前チェックの実行

サブパーティションを切り捨てる前に、データがバックアップされていることを確認します。次に、ターゲットサブパーティションの構造とデータを確認します。

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

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

-- サブパーティションのデータをチェックして、データが含まれていることを確認します。
SELECT COUNT(*) FROM customer_data SUBPARTITION (p_2022_asia);

コマンドの実行

TRUNCATE SUBPARTITION を実行して p_2022_asia サブパーティションを切り捨てます。

ALTER TABLE customer_data TRUNCATE SUBPARTITION p_2022_asia;

結果の確認

サブパーティションの構造が保持され、データが削除されたことを確認します。

-- 構造の確認: サブパーティションの定義がまだ存在することを確認します。
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'CUSTOMER_DATA';
-- クエリ結果には p_2022_asia が含まれている必要があります。

-- データの確認: サブパーティションのデータが空になったことを確認します。
SELECT COUNT(*) FROM customer_data SUBPARTITION (p_2022_asia);
-- クエリ結果は 0 です。

よくある質問

Q1: TRUNCATE SUBPARTITIONDROP SUBPARTITION の違いは何ですか?

TRUNCATE SUBPARTITION はサブパーティションからデータを削除しますが、その定義は保持します。DROP SUBPARTITION はサブパーティションの定義とデータの両方を削除します。

Q2: TRUNCATE SUBPARTITION の実行後にデータを回復できますか?

いいえ。TRUNCATE はデータを完全に削除する DDL 操作です。デフォルトでは、トランザクションログに記録されません。データは、ロールバックやフラッシュバックなどの標準的なメソッドを使用して回復することはできません。

Q3: TRUNCATE SUBPARTITIONDELETE FROM ... SUBPARTITION の違いは何ですか?

TRUNCATE SUBPARTITION は、データブロックを解放することでデータを直接削除する効率的な DDL 操作であり、ロールバックできません。DELETE は、データを 1 行ずつ削除する DML 操作です。ログを記録し、ロールバックでき、削除トリガーを発行します。

Q4: なぜ エラー "ORA-02149: relation ... does not exist" が発生するのですか?

このエラーは、サブパーティション名が存在しないか、指定された名前の大文字と小文字が実際の名前と一致しないために発生します。名前は大文字と小文字を区別します。名前を確認するには、事前チェックを実行してください。

Q5: なぜ エラー "ORA-01031: insufficient privileges" が発生するのですか?

このエラーは、コマンドを実行するユーザーがターゲットテーブルに対する ALTER 権限を持っていないために発生します。必要な権限を付与するには、データベース管理者に連絡してください。

関連する SQL