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

PolarDB:ALTER TABLE ADD SUBPARTITION

最終更新日:Oct 24, 2025

コンポジットパーティションテーブルの指定された第 1 レベルのパーティションに新しいサブパーティションを追加します。この操作はパーティション構造を拡張し、データ分布に影響を与えます。この文を実行する前に、親パーティションにサブパーティション化ポリシーが定義されていること、および新しいサブパーティションの境界または値が既存のサブパーティションと競合しないことを確認してください。

概要

ALTER TABLE table_name 
MODIFY PARTITION partition_name 
ADD SUBPARTITION { list_subpartition | range_subpartition };

-- LIST サブパーティション定義
SUBPARTITION subpartition_name
  VALUES (value[, value]...)
  [TABLESPACE tablespace_name]

-- RANGE サブパーティション定義
SUBPARTITION subpartition_name
  VALUES LESS THAN (value[, value]...) 
  [TABLESPACE tablespace_name]

パラメーター

パラメーター

必須

パラメーターの説明

table_name

はい

ターゲットのコンポジットパーティションテーブルの名前。

sales_data

partition_name

はい

新しいサブパーティションが追加されるターゲットの第 1 レベルのパーティションの名前。

p_2023

subpartition_name

はい

新しいサブパーティションの名前。

sp_q1_asia

VALUES

はい

新しいサブパーティションの境界値を定義します。
- LIST サブパーティションの場合、value は 1 つ以上のリテラル値です。
- RANGE サブパーティションの場合、LESS THAN 句を使用して上限を定義します。

VALUES('Asia') または
VALUES LESS THAN (TO_DATE(...))

TABLESPACE tablespace_name

オプション
デフォルト値: テーブルのデフォルトの表領域。

新しいサブパーティションの表領域を指定します。このパラメーターを省略すると、テーブルのデフォルトの表領域が使用されます。

TABLESPACE users_tbs

注意

  • 新しいサブパーティションのタイプ (LIST または RANGE) は、同じ親パーティション下の既存のサブパーティションのタイプと一致する必要があります。

  • subpartition_name は、テーブル内のすべてのパーティションとサブパーティションの中で一意である必要があります。

  • RANGE サブパーティションを追加する場合、VALUES LESS THAN (...) で定義された境界値は、既存のすべてのサブパーティションの上限よりも大きい必要があります。RANGE サブパーティションは昇順でのみ追加できます。サブパーティションを途中に挿入するには、ALTER TABLE ... SPLIT SUBPARTITION 文を使用して既存のサブパーティションを分割できます。

  • LIST サブパーティションを追加する場合、その VALUES (...) リスト内の値は、同じ親パーティション内の既存のサブパーティションの値と重複することはできません。

  • ADD SUBPARTITION は、テーブルレベルの排他ロック (AccessExclusiveLock) を取得します。このロックは、テーブルに対するすべての DML 操作とほとんどの DDL 操作をブロックします。このコマンドはオフピーク時に実行し、完了するのに十分なタイムウィンドウを確保してください。

  • ADD SUBPARTITION は、追加できるサブパーティションの数を制限しません。ただし、システムリソースによって実用的な制限が課せられます。最適なパフォーマンスと管理性を確保するために、単一テーブルのパーティションの総数を 1,000 未満に保ってください。

  • ADD SUBPARTITION を使用して、MAXVALUE または DEFAULT ルールによって管理されるパーティションにサブパーティションを追加しないでください。

  • テーブルにインデックスがある場合、データベースは新しいサブパーティションに対応するインデックスパーティションを自動的に作成します。

  • このコマンドを実行するには、テーブルのオーナーであるか、管理者権限を持っている必要があります。

  • 新しいサブパーティションには、最初は統計がありません。クエリオプティマイザーが正確な実行計画を生成できるように、この操作の直後にテーブルの統計を収集してください。

RANGE-LIST コンポジットパーティションテーブルへの LIST サブパーティションの追加

この例では、2023 年のパーティションに Africa リージョンの新しいサブパーティションを追加します。テーブルは、販売年 (RANGE) と販売地域 (LIST) によってコンポジットパーティション化されています。

環境の準備

このステップでは、sales_data という名前の RANGE-LIST コンポジットパーティションテーブルを作成します。テーブルは sale_dateRANGE でパーティション化され、regionLIST でサブパーティション化されます。

-- RANGE-LIST コンポジットパーティションテーブルの作成
CREATE TABLE sales_data (
    sale_id    INT,
    region     VARCHAR2(20),
    sale_date  DATE
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY LIST (region)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_asia   VALUES ('Asia'),
        SUBPARTITION sp_2023_europe VALUES ('Europe')
    )
);

事前チェックの実行

サブパーティションを追加する前に、ターゲットの第 1 レベルのパーティションが存在することを確認し、その現在のサブパーティションのリストをチェックします。

-- 第 1 レベルのパーティション p_2023 が存在することを確認
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_DATA';

-- p_2023 配下の既存のサブパーティションをチェックして、新しい値 'Africa' が存在しないことを確認
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';

コマンドの実行

ADD SUBPARTITION コマンドを実行して、値 'Africa' を持つ新しいサブパーティションを p_2023 パーティションに追加します。

ALTER TABLE sales_data MODIFY PARTITION p_2023 ADD SUBPARTITION sp_2023_africa VALUES('Africa');

結果の検証

新しいサブパーティションが存在し、その値の定義に一致するデータを受け入れることができることを確認します。

-- 構造の検証: 新しいサブパーティションが追加されたことを確認
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';
-- クエリ結果には sp_2023_africa が含まれるはずです

-- データの検証: 新しいサブパーティションにデータを挿入して検証
INSERT INTO sales_data VALUES (101, 'Africa', TO_DATE('2023-09-15', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM sales_data SUBPARTITION (sp_2023_africa);
-- クエリ結果は 1 になるはずです

RANGE-RANGE コンポジットパーティションテーブルへの RANGE サブパーティションの追加

この例では、注文年 (RANGE) と注文日 (RANGE) によってコンポジットパーティション化されたテーブルの 2023 年パーティションに、第 2 四半期 (Q2) のサブパーティションを追加します。

前提条件

このステップでは、order_history という名前の RANGE-RANGE コンポジットパーティションテーブルを作成します。テーブルは order_dateRANGE でパーティション化され、次に order_dateRANGE でサブパーティション化されます。

-- archive_tbs という名前の表領域がすでに存在すると仮定します
-- CREATE TABLESPACE archive_tbs DATAFILE 'archive_tbs.dbf' SIZE 10M;

-- RANGE-RANGE コンポジットパーティションテーブルの作成
CREATE TABLE order_history (
    order_id   INT,
    order_date DATE
)
PARTITION BY RANGE (order_date)
SUBPARTITION BY RANGE (order_date)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD'))
    )
);

事前チェックの実行

ターゲットの第 1 レベルのパーティションが存在することを確認し、その現在のサブパーティションの境界をチェックして、新しい境界が競合を引き起こさないことを確認します。

-- 第 1 レベルのパーティション p_2023 が存在することを確認
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'ORDER_HISTORY';

-- p_2023 配下の既存のサブパーティションとその境界をチェック
SELECT SUBPARTITION_NAME, HIGH_VALUE FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'ORDER_HISTORY' AND PARTITION_NAME = 'P_2023';

コマンドの実行

ADD SUBPARTITION コマンドを実行して、上限が 2023-07-01 の新しいサブパーティションを p_2023 パーティションに追加します。

ALTER TABLE order_history MODIFY PARTITION p_2023 
ADD SUBPARTITION sp_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD'));

結果の検証

新しいサブパーティションが作成されたこと、およびそれにデータを挿入できることを確認します。

-- 構造の検証: 新しいサブパーティションが追加されたことを確認し、その表領域をチェック
SELECT * FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'ORDER_HISTORY' AND SUBPARTITION_NAME = 'SP_2023_Q2';
-- クエリ結果には SP_2023_Q2 と ARCHIVE_TBS が表示されるはずです

-- データの検証: 新しいサブパーティションにデータを挿入して検証
INSERT INTO order_history VALUES (201, TO_DATE('2023-05-20', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM order_history SUBPARTITION (sp_2023_q2);
-- クエリ結果は 1 になるはずです

よくある質問

Q1: なぜエラー ORA-14321: subpartition ... already exists が発生するのですか?
このエラーは、新しいサブパーティションの VALUES 定義が、同じ第 1 レベルのパーティション下の既存のサブパーティションと競合するために発生します。LIST サブパーティションの場合、値はすでに存在します。RANGE サブパーティションの場合、新しい境界が最後の境界よりも高くありません。新しいサブパーティションには、重複しない境界値を指定してください。

Q2: なぜエラー ORA-02269: partition does not exist が発生するのですか?
このエラーは、MODIFY PARTITION 句で指定された partition_name が存在しないために発生します。USER_TAB_PARTITIONS ビューをクエリして、第 1 レベルのパーティションの正しい名前を確認してください。

Q3: なぜエラー ORA-14150: subpartitioning is not specified が発生するのですか?
サブパーティション化ポリシーを持たないパーティションテーブルで ADD SUBPARTITION を実行しようとしました。このコマンドは、コンポジットパーティションテーブルにのみ適用されます。

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

Q5: なぜエラー ORA-14074: partition bound must collate higher than that of the last partition が発生するのですか?

ADD SUBPARTITION コマンドは、既存の範囲の末尾に RANGE サブパーティションを追加することしかできません。サブパーティションを途中に挿入するには、代わりに SPLIT SUBPARTITION コマンドを使用してください。

関連する文