コンポジットパーティションテーブルの指定された第 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]
パラメーター
パラメーター | 必須 | パラメーターの説明 | 例 |
| はい | ターゲットのコンポジットパーティションテーブルの名前。 |
|
| はい | 新しいサブパーティションが追加されるターゲットの第 1 レベルのパーティションの名前。 |
|
| はい | 新しいサブパーティションの名前。 |
|
| はい | 新しいサブパーティションの境界値を定義します。 |
|
| オプション | 新しいサブパーティションの表領域を指定します。このパラメーターを省略すると、テーブルのデフォルトの表領域が使用されます。 |
|
注意
新しいサブパーティションのタイプ (
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) によってコンポジットパーティション化されています。
RANGE-RANGE コンポジットパーティションテーブルへの RANGE サブパーティションの追加
この例では、注文年 (RANGE) と注文日 (RANGE) によってコンポジットパーティション化されたテーブルの 2023 年パーティションに、第 2 四半期 (Q2) のサブパーティションを追加します。
よくある質問
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 コマンドを使用してください。
関連する文
ALTER TABLE ADD PARTITION: パーティションテーブルに新しい第 1 レベルのパーティションを追加します。
ALTER TABLE DROP SUBPARTITION: 指定されたサブパーティションを削除します。
ALTER TABLE SPLIT SUBPARTITION: 1 つのサブパーティションを 2 つのサブパーティションに分割します。