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

PolarDB:ALTER TABLE…TRUNCATE PARTITION

最終更新日:Oct 24, 2025

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

概要

ALTER TABLE table_name TRUNCATE PARTITION partition_name
  [{DROP|REUSE} STORAGE]

パラメーター

パラメーター

必須

説明

table_name

はい

パーティションテーブルの名前。

sales_records

partition_name

はい

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

p_2023_q1

{DROP|REUSE} STORAGE

いいえ

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

DROP STORAGE/

REUSE STORAGE

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

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

  • TRUNCATE PARTITION は、ファイルの削除と組み合わせたメタデータのみの操作です。数億行のパーティションであっても数秒で完了し、I/O、CPU、およびメモリのオーバーヘッドは最小限です。

  • テーブルに ON TRUNCATE トリガーが定義されている場合、この操作はそれらを起動します。意図しない副作用を防ぐために、これらのトリガーのビジネスロジックを理解していることを確認してください。

この例では、販売記録テーブルから過去の四半期パーティションを切り捨てる方法を示します。これは一般的なデータライフサイクル管理タスクであり、古いデータを削除しつつ、後で同じ期間の新しいデータをロードするためにパーティション構造を保持します。

環境の準備

このステップでは、販売日で範囲パーティション化された sales_records という名前のテーブルを作成します。また、第 1 四半期と第 2 四半期のデータをそれぞれ格納するために、p_2023_q1p_2023_q2 の 2 つのパーティションを作成します。

-- パーティションテーブルの作成
CREATE TABLE sales_records (
    sale_id    INT NOT NULL,
    product_id INT NOT NULL,
    sale_date  DATE NOT NULL
)
PARTITION BY RANGE (sale_date) (
    PARTITION p_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')),
    PARTITION p_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD'))
);

-- データの挿入
INSERT INTO sales_records VALUES (1, 101, TO_DATE('2023-01-15', 'YYYY-MM-DD'));
INSERT INTO sales_records VALUES (2, 102, TO_DATE('2023-04-20', 'YYYY-MM-DD'));
COMMIT;

事前チェックの実行

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

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

-- パーティション構造をチェックして、パーティション p_2023_q1 が存在することを確認します。
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_RECORDS';

-- パーティションデータをチェックして、パーティションにデータが含まれていることを確認します。
SELECT COUNT(*) FROM sales_records PARTITION (p_2023_q1);

コマンドの実行

TRUNCATE PARTITION コマンドを実行して、p_2023_q1 パーティションを切り捨てます。

ALTER TABLE sales_records TRUNCATE PARTITION p_2023_q1;

結果の検証

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

-- 構造の検証: パーティション定義がまだ存在することを確認します。
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_RECORDS';
-- クエリ結果にはまだ p_2023_q1 が含まれています。

-- データの検証: パーティション内のデータが削除されたことを確認します。
SELECT COUNT(*) FROM sales_records PARTITION (p_2023_q1);
-- クエリ結果は 0 です。

切り捨て操作はテーブルの統計情報を無効にし、クエリのパフォーマンスを低下させる可能性があります。操作の直後に ANALYZE を実行してください。

ANALYZE sales; -- 親テーブルの統計情報を更新します。

よくある質問

Q1: TRUNCATE PARTITIONDROP PARTITION の違いは何ですか?
TRUNCATE PARTITION はパーティション内のデータのみを削除しますが、パーティション定義は保持します。対照的に、DROP PARTITION はパーティション定義とそのすべてのデータの両方を削除します。

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

Q3: このコマンドを実行すると、なぜ RA-02149: specified partition does not exist というエラーが表示されるのですか?
このエラーは、指定されたパーティションが存在しないか、その名前の大文字と小文字が一致しないことを示します。事前チェックセクションのクエリを実行して正確なパーティション名を確認するか、完全に一致させるために二重引用符を使用してください。

Q4: このコマンドを実行すると、なぜ ORA-01031: insufficient privileges というエラーが表示されるのですか?
このエラーは、コマンドを実行しているユーザーがターゲットテーブルに対する ALTER 権限を持っていないために発生します。データベース管理者に連絡して、必要な権限を付与してもらってください。

Q5: このコマンドを実行すると、なぜ ERROR: cannot truncate partition of table because it has global indexes というエラーが表示されるのですか?

TRUNCATE PARTITION は、テーブルにグローバルインデックスがある場合に失敗します。グローバルインデックスは、すべてのパーティションにわたって一意性とアクセスパスを維持します。TRUNCATE 操作は、グローバルインデックスの整合性を損なうことなくインデックスエントリを迅速にクリアすることはできません。

関連する SQL