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

PolarDB:ALTER TABLE…DROP PARTITION

最終更新日:Oct 24, 2025

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

構文

ALTER TABLE [schema.]table_name DROP PARTITION partition_name;

パラメーター

パラメーター

必須

説明

table_name

はい

パーティションを削除するターゲットパーティションテーブルの名前。

sales_records

partition_name

はい

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

p_2023_q1

注意

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

  • パーティションテーブルには少なくとも 1 つのパーティションが必要なため、テーブルの最後のパーティションを削除することはできません。

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

準備

-- 販売日範囲でパーティション化されたテーブルを作成します。
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'))
);

-- グローバル一意なインデックスを作成します。
CREATE UNIQUE INDEX idx_sale_id_global ON sales_records(sale_id) GLOBAL;

-- データを挿入します。
INSERT INTO sales_records VALUES (1, 101, TO_DATE('2023-01-15', 'YYYY-MM-DD')); -- q1
INSERT INTO sales_records VALUES (2, 102, TO_DATE('2023-04-20', 'YYYY-MM-DD')); -- q2

事前チェックの実行

パーティションを削除する前に、これらのチェックを実行して、データの損失やサービスの中断を防ぎます。

  1. パーティションが存在することを確認します。

    -- パーティション情報を確認します。
    SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_RECORDS';
    -- p_2023_q1 がリストにあることを確認します。
  2. (オプション) データバックアップを作成します。

    誤って削除しないように、パーティションを削除する前にテーブルまたはデータベース全体をバックアップしてください。「バックアップ方法」をご参照ください。

  3. 運用への影響を評価します。

    現在テーブルにアクセスしている長時間トランザクションや重大なワークロードがないか確認します。削除操作はテーブルレベルの排他ロックを取得し、すべての読み取りおよび書き込みリクエストをブロックします。

    -- アクティブなロックを確認します。
    SELECT locktype, relation::regclass, mode, granted, pid
    FROM pg_locks
    WHERE relation = 'SALES_RECORDS'::regclass;

コマンドの実行

事前チェックが完了したら、オフピーク時に ALTER TABLE ... DROP PARTITION コマンドを実行します。

ALTER TABLE sales_records DROP PARTITION P_2023_Q1;

結果の確認

操作が完了したら、パーティションとそのデータが期待どおりに削除されたことを確認します。

  1. パーティションが削除されたことを確認する

    メタデータビューをクエリして、削除されたパーティションがパーティションリストにないことを確認します。

    SELECT partition_name
    FROM ALL_TAB_PARTITIONS
    WHERE table_name = 'SALES_RECORDS' and partition_name = 'P_2023_Q1';
    -- 期待される結果: コマンドは空の結果セットを返します。
  2. データが削除されたことを確認します。

    削除されたパーティションのデータをクエリして、削除されたことを確認します。

    SELECT * 
    FROM sales_records 
    WHERE sale_date < '2023-04-01';
    -- 期待される結果: コマンドは空の結果セットを返します。
  3. テーブル統計を更新します。

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

    ANALYZE SALES_RECORDS;

よくある質問

Q1: コマンドを実行した後に partition "..." of relation "..." does not exist エラーが表示されるのはなぜですか?

パーティション名が存在しないか、大文字と小文字が一致していません。パーティション名では大文字と小文字が区別されます。正確なパーティション名を確認するには USER_TAB_PARTITIONS ビューをクエリするか、完全に一致させるために二重引用符 ("") を使用します。

Q2: permission denied for table ... または must be owner of table ... エラーが表示されるのはなぜですか?

現在のユーザーには十分な権限がありません。テーブルのオーナーまたは権限を持つユーザーに切り替えてコマンドを実行してください。

Q3: cannot drop partition due to dependent objects エラーが表示されるのはなぜですか?

外部キー制約やビューなど、他のデータベースオブジェクトがこのパーティションに依存しています。デフォルトの RESTRICT 動作では、削除ができません。まず、これらの依存オブジェクトを特定して削除する必要があります。

Q4: 操作に時間がかかったり、スタックしているように見えたりするのはなぜですか?

DROP PARTITION 文は AccessExclusiveLock を取得します。このロックが別のアクティブな長時間トランザクションによってブロックされている場合、操作は待機する必要があり、遅延やタイムアウトが発生する可能性があります。ブロッキングセッションは、アクティブなロックを確認することで特定できます。次に、そのクエリの (blocking_pid) を使用して、次の文でセッションに関する詳細を検索します。

-- PID に基づいてブロッキングスレッドのユーザー情報をクエリします。
SELECT 
    pid,
    usename AS username,           -- データベースのユーザー名
    application_name,              -- アプリケーション名 (JDBC、psql など)
    client_addr,                   -- クライアント IP アドレス
    client_hostname,               -- クライアントのホスト名
    client_port,                   -- クライアントポート
    backend_start,                 -- 接続が開始された時間
    xact_start,                    -- トランザクションが開始された時間
    query_start,                   -- 現在のクエリが開始された時間
    state_change,                  -- ステータスが最後に変更された時間
    state,                         -- ステータス (アクティブ、アイドル、トランザクション中のアイドル)
    wait_event_type,               -- 待機イベントタイプ (Lock、IO など)
    wait_event,                    -- 特定の待機イベント
    query                          -- 現在実行中または最後に実行された SQL 文
FROM 
    pg_stat_activity
WHERE 
    pid in 'blocking_pid'; 

関連する SQL