ヘッダーをスキップ
Oracle® Database VLDBおよびパーティショニング・ガイド
11g リリース2 (11.2)
B56316-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

パーティションのメンテナンス

この項では、表と索引の両方で、パーティションおよびサブパーティションのメンテナンス操作を実行する方法を説明します。

この項の内容は次のとおりです。


関連項目:

  • 表の管理については、『Oracle Database管理者ガイド』を参照してください。

  • パーティション表や索引を変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。



注意:

次の項では、パーティション表に対するメンテナンス操作を説明します。メンテナンス操作に影響される索引または索引パーティションの使用性が説明されている箇所では、次のことを考慮してください。
  • UNUSABLEとマークできるのは、空ではない索引と索引パーティションのみです。空の場合には、USABLE/UNUSABLEのステータスは変更されません。

  • ステータスがUSABLEの索引または索引パーティションは、後続のDMLで更新されます。


パーティションで実行できるメンテナンス操作

表4-1に、パーティション表およびコンポジット・パーティション表で実行できるパーティションのメンテナンス操作を示します。表4-2には、コンポジット・パーティション表で実行できるサブパーティションのメンテナンス操作を示します。パーティション化およびサブパーティション化の種類ごとに、メンテナンス操作の実行に使用されるALTER TABLE文の特定の句が示されます。

表4-1 表パーティションに対するALTER TABLEメンテナンス操作

メンテナンス操作 レンジ・コンポジット・レンジ - * 時間隔コンポジット時間隔 - * ハッシュ リスト・コンポジット・リスト - * 参照

パーティションの追加


ADD PARTITION

ADD PARTITION

ADD PARTITION

ADD PARTITION

N/A脚注1

パーティションの結合


N/A

N/A

COALESCE PARTITION

N/A

N/A脚注1

パーティションの削除


DROP PARTITION

DROP PARTITION

N/A

DROP PARTITION

N/A脚注1

パーティションの交換


EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

パーティションのマージ


MERGE PARTITIONS

MERGE PARTITIONS

N/A

MERGE PARTITIONS

N/A脚注1

デフォルト属性の変更


MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

パーティションの実際の属性の変更


MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

リスト・パーティションの変更: 値の追加


N/A

N/A

N/A

MODIFY PARTITION ... ADD VALUES

N/A

リスト・パーティションの変更: 値の削除


N/A

N/A

N/A

MODIFY PARTITION ... DROP VALUES

N/A

パーティションの移動


MOVE SUBPARTITION

MOVE SUBPARTITION

MOVE PARTITION

MOVE SUBPARTITION

MOVE PARTITION

パーティション名の変更


RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

パーティションの分割


SPLIT PARTITION

SPLIT PARTITION

N/A

SPLIT PARTITION

N/A脚注1

パーティションの切捨て


TRUNCATE PARTITION

TRUNCATE PARTITION

TRUNCATE PARTITION

TRUNCATE PARTITION

TRUNCATE PARTITION


脚注1 これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。

表4-2 表サブパーティションに対するALTER TABLEメンテナンス操作

メンテナンス操作 コンポジット* - レンジ コンポジット* - ハッシュ コンポジット* - リスト

パーティションの追加


MODIFY PARTITION ... ADD SUBPARTITION

MODIFY PARTITION ... ADD SUBPARTITION

MODIFY PARTITION ... ADD SUBPARTITION

パーティションの結合


N/A

MODIFY PARTITION ... COALESCE SUBPARTITION

N/A

パーティションの削除


DROP SUBPARTITION

N/A

DROP SUBPARTITION

パーティションの交換


EXCHANGE SUBPARTITION

N/A

EXCHANGE SUBPARTITION

パーティションのマージ


MERGE SUBPARTITIONS

N/A

MERGE SUBPARTITIONS

デフォルト属性の変更


MODIFY DEFAULT ATTRIBUTES FOR PARTITION

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

パーティションの実際の属性の変更


MODIFY SUBPARTITION

MODIFY SUBPARTITION

MODIFY SUBPARTITION

リスト・パーティションの変更: 値の追加


N/A

N/A

MODIFY SUBPARTITION ... ADD VALUES

リスト・パーティションの変更: 値の削除


N/A

N/A

MODIFY SUBPARTITION ... DROP VALUES

サブパーティション・テンプレートの変更


SET SUBPARTITION TEMPLATE

SET SUBPARTITION TEMPLATE

SET SUBPARTITION TEMPLATE

パーティションの移動


MOVE SUBPARTITION

MOVE SUBPARTITION

MOVE SUBPARTITION

パーティション名の変更


RENAME SUBPARTITION

RENAME SUBPARTITION

RENAME SUBPARTITION

パーティションの分割


SPLIT SUBPARTITION

N/A

SPLIT SUBPARTITION

パーティションの切捨て


TRUNCATE SUBPARTITION

TRUNCATE SUBPARTITION

TRUNCATE SUBPARTITION



注意:

ビットマップ索引のあるパーティション表や、現在圧縮されていないパーティションのみを含むパーティション表に、圧縮されたパーティションを組み込むために最初に表圧縮を使用する場合は、次の手順を実行する必要があります。
  • 既存のすべてのビットマップ索引およびビットマップ索引パーティションを削除するか、UNUSABLEとマークします。

  • 表圧縮属性を設定します。

  • 索引を再作成します。

これらの処理は、パーティションにデータが含まれているかどうかには関係なく、圧縮されたパーティションを組み込む操作です。

これは、Bツリー索引を含むパーティション表、またはパーティション索引構成表には適用されません。


表4-3に索引パーティションで実行可能なメンテナンス操作を示し、どのタイプの索引(グローバルまたはローカル)で実行可能かを記載します。メンテナンス操作に使用するALTER INDEX句を表示します。

グローバル索引は、基礎となる表の構造を反映しません。パーティション化されている場合は、レンジまたはハッシュでパーティション化できます。パーティション・グローバル索引では、パーティション表で実行可能なパーティション・メンテナンス操作のすべてではなく、一部が共有されます。

ローカル索引では基礎となる表の構造が反映されるため、表パーティションおよびサブパーティションがメンテナンス・アクティビティの影響を受けると、パーティション化も自動的にメンテナンスされます。そのため、ローカル索引でのパーティション・メンテナンスの必要性は低く、オプションの数も少なくなっています。

表4-3 索引パーティションに対するALTER INDEXメンテナンス操作

メンテナンス操作 索引のタイプ 索引パーティション化のタイプ
レンジ ハッシュおよびリスト コンポジット

索引パーティションの追加


グローバル

-

ADD PARTITION(ハッシュのみ)

-


ローカル

N/A

N/A

N/A

索引パーティションの削除


グローバル

DROP PARTITION

-

-


ローカル

N/A

N/A

N/A

索引パーティションのデフォルト属性の変更


グローバル

MODIFY DEFAULT ATTRIBUTES

-

-


ローカル

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

索引パーティションの実際の属性の変更


グローバル

MODIFY PARTITION

-

-


ローカル

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY SUBPARTITION

索引パーティションの再作成


グローバル

REBUILD PARTITION

-

-


ローカル

REBUILD PARTITION

REBUILD PARTITION

REBUILD SUBPARTITION

索引パーティション名の変更


グローバル

RENAME PARTITION

-

-


ローカル

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME SUBPARTITION

索引パーティションの分割


グローバル

SPLIT PARTITION

-

-


ローカル

N/A

N/A

N/A


索引の自動更新

パーティション表および索引に対する個々のメンテナンス操作を説明する前に、ALTER TABLE文に指定可能なUPDATE INDEXES句の影響を説明します。

デフォルトでは、パーティション表に対する表メンテナンス操作の多くにより、対応する索引または索引パーティションが無効化(UNUSABLEとマーク)されます。索引全体または各パーティション(グローバル索引の場合)を再作成する必要があります。メンテナンス操作で、ALTER TABLE文にUPDATE INDEXESを指定すると、データベースによりこのデフォルトの動作が上書きされます。この句を指定すると、メンテナンス操作のDDL文の実行時に、データベースにより索引が更新されます。これには、次の利点があります。

  • 索引が、ベース表操作とともに更新されます。後で更新して、個別に索引を再作成する必要はありません。

  • グローバル索引はUNUSABLEとマークされないため、高い可用性を備えています。パーティションDDLの実行中でもこれらの索引は使用可能なままで、表内の影響を受けないパーティションにアクセスできます。

  • すべての無効な索引を再作成するために、名前を調べる必要はありまん。

ローカル索引のオプションの句で、更新されたローカル索引やそのパーティションに物理特性および記憶域特性を指定できます。

  • 各ローカル索引のそれぞれのパーティションに物理属性、表領域記憶域およびロギングを指定できます。または、PARTITIONキーワードのみを指定して、次のようにデータベースによるパーティション属性の更新を行うことも可能です。

    • 単一の表パーティションに対する操作(MOVE PARTITIONSPLIT PARTITIONなど)では、対応する索引パーティションは影響を受ける索引パーティションの属性を継承します。データベースでは新しい索引パーティションの名前は生成されないため、この操作により作成される新しい索引パーティションは、対応する新しい表パーティションから名前を継承します。

    • MERGE PARTITION操作では、結果のローカル索引パーティションは、結果の表パーティションから名前を継承し、ローカル索引から属性を継承します。

  • コンポジット・パーティション索引では、各サブパーティションに表領域記憶域を指定できます。


関連項目:

索引を更新する構文については、ALTER TABLEupdate_all_indexes_clauseを参照してください。

次の操作では、UPDATE INDEXES句がサポートされています。

  • ADD PARTITION | SUBPARTITION

  • COALESCE PARTITION | SUBPARTITION

  • DROP PARTITION | SUBPARTITION

  • EXCHANGE PARTITION | SUBPARTITION

  • MERGE PARTITION | SUBPARTITION

  • MOVE PARTITION | SUBPARTITION

  • SPLIT PARTITION | SUBPARTITION

  • TRUNCATE PARTITION | SUBPARTITION

SKIP_UNUSABLE_INDEXES初期化パラメータ

SKIP_UNUSABLE_INDEXESは、デフォルト値がTRUEの初期化パラメータです。この設定により、UNUSABLEとマークされた索引および索引パーティションのエラー・レポートが無効化されます。使用できない要素を避けるために、データベースが別の実行計画を選択しないようにするには、このパラメータをFALSEに設定する必要があります。

索引を自動更新する際の考慮事項

UPDATE INDEXESを指定する際は、次の影響に注意してください。

  • 事前にUNUSABLEとマークされていた索引が更新されるため、パーティションDDL文の実行時間が長くなります。ただし、この増加した時間を、索引を更新せずにDDLを実行し、すべての索引を再作成する場合にかかる時間と比較する必要があります。パーティションのサイズが表サイズの5%に満たない場合は、経験則から言って、索引を更新する方が短時間ですみます。

  • DROPTRUNCATEおよびEXCHANGE操作は高速な操作ではなくなりました。こちらも、DDLを実行してすべての索引を再作成する場合にかかる時間と比較する必要があります。

  • グローバル索引を含む表を更新する際の考慮事項は、次のとおりです。

    • 索引はその場で更新されます。索引の更新は記録され、REDOおよびUNDOレコードが生成されます。反対に、グローバル索引全体を再作成する場合は、NOLOGGINGモードで実行できます。

    • 索引全体を手動で再作成すると、領域がより有効に使用されて圧縮されるため、より効率的な索引が作成されます。

  • UPDATE INDEXES句は、索引構成表ではサポートされていません。ただし、DROP PARTITIONTRUNCATE PARTITIONおよびEXCHANGE PARTITION操作でUPDATE GLOBAL INDEXES句を使用して、索引構成表のグローバル索引を使用可能なままにできます。前述のリストのその他の操作では、索引構成表のグローバル索引は使用可能なままになります。また、索引構成表のローカル索引パーティションは、MOVE PARTITION操作後も使用可能なままです。

パーティションの追加

この項では、パーティション表に新しいパーティションを手動で追加する方法、および多くのパーティション索引に明示的にパーティションを追加できない理由を説明します。

レンジ・パーティション表へのパーティションの追加

ハイエンド(既存の最後のパーティションの後ろのポイント)に新しいパーティションを追加するには、ALTER TABLE ... ADD PARTITION文を使用します。表の最初または中間にパーティションを追加するには、SPLIT PARTITION句を使用します。

たとえば、前の12か月分に加え、今月のデータも含む表salesがあるとします。1999年1月1日を基準に、表領域tsxに格納される1月用のパーティションを追加します。

ALTER TABLE sales
      ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' )
      TABLESPACE tsx;

レンジ・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。

ハッシュ・パーティション表へのパーティションの追加

ハッシュ・パーティション表にパーティションを追加すると、データベースにより、新しいパーティションに既存のパーティション(データベースが選択)から再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。その結果、表にデータが含まれる場合、ハッシュ・パーティションの追加に時間がかかる場合があります。

次の文では、表scubagearにハッシュ・パーティションを追加する2つの方法を示します。最初の文では、パーティション名がシステム生成される新しいハッシュ・パーティションが追加され、デフォルトの表領域に配置されます。2番目の文でも、新しいハッシュ・パーティションが追加されますが、そのパーティションには明示的にp_namedという名前が付けられ、表領域gear5に作成されます。

ALTER TABLE scubagear ADD PARTITION;

ALTER TABLE scubagear
      ADD PARTITION p_named TABLESPACE gear5;

次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作
通常(ヒープ) ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:
  • 新しいパーティションおよび行の再配布元の既存のパーティションのローカル索引がUNUSABLEとマークされ、再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成
  • ローカル索引の場合、動作はヒープ表と同じです。
  • すべてのグローバル索引は使用可能なままです。


リスト・パーティション表へのパーティションの追加

次の文で、リスト・パーティション表に新しいパーティションを追加する方法を示します。この例では、追加されるパーティションに物理属性およびNOLOGGINGが指定されています。

ALTER TABLE q1_sales_by_region 
   ADD PARTITION q1_nonmainland VALUES ('HI', 'PR')
      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3
      NOLOGGING;

追加するパーティションを説明する一連のリテラル値は、表のどのパーティションにも存在していない必要があります。

デフォルトのパーティションがあるリスト・パーティション表にはパーティションを追加できませんが、デフォルトのパーティションを分割することはできます。分割することで、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを効率的に作成できます。

リスト・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。

時間隔パーティション表へのパーティションの追加

パーティションを最初にロックしないかぎり、時間隔パーティション表にパーティションを明示的に追加することはできません。ロックすることで、パーティションの作成がトリガーされます。ある時間隔のデータが挿入されると、データベースによってその時間隔のパーティションが自動的に作成されます。一般的には、パーティション交換ロード・シナリオの場合のみ、時間隔パーティションを明示的に作成する必要があります。

後続のパーティションの時間隔を変更するには、ALTER TABLE文のSET INTERVAL句を使用します。この句により、すべてのマテリアライズ化された時間隔パーティションの現在の上限値を超えるパーティションの時間隔が変更されます。

既存のレンジ・パーティションまたはレンジ - *コンポジット・パーティション表を、時間隔または時間隔 - *パーティション表に移行するには、SET INTERVAL句も使用します。後続の時間隔パーティションの作成を無効化し、効率的にレンジ・パーティション表に戻すには、SET INTERVAL句に空の値を使用します。作成された時間隔パーティションは、現在の上限値を使用してレンジ・パーティションに変換されます。

日付レンジの時間隔を増加するには、新しい時間隔の関連する上限値を指定していることを確認する必要があります。たとえば、1日単位の時間隔パーティション表トランザクションの時間隔パーティションの上限値が2007年1月30日で、月単位の時間隔パーティションに変更する場合、次の文ではエラーが発生します。

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

ORA-14767: Cannot specify this interval with existing high bounds

月単位の時間隔に正常に変更するには、上限値が2007年2月1日の日付単位の別のパーティションを作成する必要があります。

LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') IN SHARE MODE;

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

時間隔パーティション表の下位パーティションはレンジ・パーティションです。時間隔パーティション表のレンジ部分にさらにパーティションを追加するには、レンジ・パーティションを分割します。

transactions表の時間隔パーティション化を無効化するには、次の文を使用します。

ALTER TABLE transactions SET INTERVAL ();

コンポジット* - ハッシュ・パーティション表へのパーティションの追加

パーティションは、パーティション・レベルとハッシュ・サブパーティション・レベルの両方で追加できます。

* - ハッシュ・パーティション表へのパーティションの追加

[レンジ | リスト | 時間隔] - ハッシュ・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。時間隔 - ハッシュ・パーティション表の場合、時間隔パーティションは自動的に作成されます。指定した数のサブパーティションを追加できるSUBPARTITIONS句を指定することも、特定のサブパーティションに名前を付けるSUBPARTITION句を指定することも可能です。SUBPARTITIONSまたはSUBPARTITION句が指定されていない場合、パーティションはサブパーティションの表レベルのデフォルトを継承します。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

この例では、2000年の第1四半期のデータが移入されるレンジ・パーティション q1_2000を、レンジ - ハッシュ・パーティション表salesに追加しています。表領域tbs5に格納される8つのサブパーティションがあります。サブパーティションを、表圧縮を使用するように明示的に設定することはできません。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。

ALTER TABLE sales ADD PARTITION q1_2000
      VALUES LESS THAN (2000, 04, 01) COMPRESS
      SUBPARTITIONS 8 STORE IN tbs5;

* - ハッシュ・パーティション表へのサブパーティションの追加

ハッシュ・サブパーティションを[レンジ | リスト | 時間隔] - ハッシュ・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ... ADD SUBPARTITION句を使用します。新しく追加されたサブパーティションには、同じパーティションのその他のサブパーティションから再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

次の例では、表divingのレンジ・パーティションlocations_usに、表領域us1に格納される新しいハッシュ・サブパーティションus_loc5が追加されています。

ALTER TABLE diving MODIFY PARTITION locations_us
      ADD SUBPARTITION us_locs5 TABLESPACE us1;

UPDATE INDEXESを指定しない場合は、追加および再度ハッシュされたサブパーティションに対応する索引サブパーティションを再作成する必要があります。

コンポジット* - リスト・パーティション表へのパーティションの追加

パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で追加できます。

* - リスト・パーティション表へのパーティションの追加

[レンジ | リスト | 時間隔] - リスト・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。特定の時間隔のデータが挿入されると、データベースにより時間隔パーティションが自動的に作成されます。サブパーティションに名前を付け、値リストを提供するには、SUBPARTITION句を指定できます。SUBPARTITION句が指定されていない場合、パーティションはサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、単一のデフォルトのサブパーティションが作成されます。

例4-28の文では、レンジ - リスト・メソッドでパーティション化されたquarterly_regional_sales表に、新しいパーティションを追加しています。指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。

例4-28 レンジ - リスト・パーティション表へのパーティションの追加

ALTER TABLE quarterly_regional_sales 
   ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING
         (
          SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),
          SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),
          SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),
          SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),
          SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')
         );

* - リスト・パーティション表へのサブパーティションの追加

リスト・サブパーティションを[レンジ | リスト | 時間隔] - リスト・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ... ADD SUBPARTITION句を使用します。時間隔 - リスト・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

次の文では、レンジ - リスト・パーティション表quarterly_regional_salesの一連の既存のサブパーティションに、新しいサブパーティションを追加します。新しいサブパーティションは、表領域ts2に作成されます。

ALTER TABLE quarterly_regional_sales
   MODIFY PARTITION q1_1999 
      ADD SUBPARTITION q1_1999_south
         VALUES ('AR','MS','AL') tablespace ts2;

コンポジット* - レンジ・パーティション表へのパーティションの追加

パーティションは、パーティション・レベルとレンジ・サブパーティション・レベルの両方で追加できます。

* - レンジ・パーティション表へのパーティションの追加

[レンジ | リスト | 時間隔] - レンジ・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。特定の時間隔のデータが挿入されると、データベースにより時間隔 - レンジ・パーティション表に時間隔パーティションが自動的に作成されます。特定のサブパーティションに名前を付け、レンジを指定するには、SUBPARTITION句を指定します。SUBPARTITION句が指定されていない場合、パーティションは、表レベルに指定されたサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、最大値がMAXVALUEの単一のサブパーティションが作成されます。

例4-29では、2007年1月に注文された出荷品に関するデータが移入されるレンジ・パーティションp_2007_janを、レンジ - レンジ・パーティション表shipmentsに追加します。3つのサブパーティションがあります。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。

例4-29 レンジ - レンジ・パーティション表へのパーティションの追加

ALTER TABLE shipments
   ADD PARTITION p_2007_jan
      VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS
      ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy'))
      , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
      , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy'))
      ) ;

* - レンジ・パーティション表へのサブパーティションの追加

レンジ・サブパーティションを[レンジ | リスト | 時間隔] - レンジ・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ... ADD SUBPARTITION句を使用します。時間隔 - レンジ・パーティション表の場合、パーティションを追加できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのみです。

次の例では、order_dateが2007年1月で、delivery_dateが2007年4月1日以降のすべての値が含まれるshipments表に、レンジ・サブパーティションを追加します。

ALTER TABLE shipments
   MODIFY PARTITION p_2007_jan
      ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;

参照パーティション表へのパーティションまたはサブパーティションの追加

レンジ、ハッシュ、リストまたはコンポジット・パーティション表にパーティションやサブパーティションを追加できるのと同じように、参照パーティション定義の親表にもパーティションまたはサブパーティションを追加できます。追加操作は、子参照パーティション表に自動的にカスケードされます。マスター表へのパーティションまたはサブパーティションの追加時に、DEPENDENT TABLES句により、依存表に特定のプロパティを設定できます。


関連項目:

『Oracle Database SQL言語リファレンス』

索引パーティションの追加

ローカル索引には、明示的にパーティションを追加できません。かわりに、基礎となる表にパーティションを追加する場合にのみ、ローカル索引に新しいパーティションが追加されます。特に、表にローカル索引が定義されていて、パーティションを追加するALTER TABLE文を発行する場合には、一致するパーティションがローカル索引にも追加されます。データベースにより、新しい索引パーティションに名前とデフォルトの物理記憶域属性が割り当てられますが、ADD PARTITION操作が完了した後にそれらを変更できます。

ADD PARTITION操作で、最初に索引のデフォルト属性を変更することにより、索引パーティションの新しい表領域を事実上指定できます。たとえば、リスト・パーティション表q1_sales_by_regionに、ローカル索引q1_sales_by_region_locixを作成したとします。「リスト・パーティション表へのパーティションの追加」に示されているように、新しいパーティションq1_nonmainlandを追加する前に次の文を発行した場合、対応する索引パーティションは表領域tbs_4に作成されます。

ALTER INDEX q1_sales_by_region_locix
   MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4;

それ以外の場合は、追加した後に、次の文を使用して索引パーティションをtbs_4に移動する必要があります。

ALTER INDEX q1_sales_by_region_locix 
   REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;
 

ALTER INDEXADD PARTITION構文を使用して、ハッシュ・パーティション・グローバル索引にパーティションを追加できます。データベースによりハッシュ・パーティションが追加され、索引の既存のハッシュ・パーティションから再度ハッシュされた索引エントリが、ハッシュ関数で決定されたとおりに移入されます。次の文では、 「ハッシュ・パーティション・グローバル索引の作成」に示されている索引hgidxに、パーティションを追加します。

ALTER INDEX hgidx ADD PARTITION p5;

最高位パーティションにはMAXVALUEというパーティション・バウンドがあるため、レンジ・パーティション・グローバル索引にはパーティションを追加できません。新しい最高位パーティションを追加するには、ALTER INDEX ... SPLIT PARTITION文を使用します。

パーティションの結合

パーティションの結合は、ハッシュ・パーティション表または索引のパーティション数や、* - ハッシュ・パーティション表のサブパーティション数を減らす方法の1つです。ハッシュ・パーティションを結合すると、そのコンテンツはハッシュ関数で決定された1つ以上の残りのパーティションに再配布されます。結合される特定のパーティションはデータベースにより選択され、コンテンツの再配布後に削除されます。参照パーティション表定義の親表のハッシュ・パーティションまたはサブパーティションを結合すると、参照パーティション表は新しいパーティション化定義を自動的に継承します。

次の表で説明するように、索引パーティションはUNUSABLEとマークされます。

表のタイプ 索引の動作
通常(ヒープ) ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:
  • 選択したパーティションに対応するローカル索引パーティションも削除されます。取り込む側の1つ以上のパーティションに対応するローカル索引パーティションはUNUSABLEとマークされ、再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成
  • ヒープ索引で説明したように、一部のローカル索引はUNUSABLEとマークされます。
  • すべてのグローバル索引は使用可能なままです。


ハッシュ・パーティション表でのパーティションの結合

ハッシュ・パーティション表でパーティションを結合する場合には、ALTER TABLE ... COALESCE PARTITION文が使用されます。次の文では、パーティションを結合することにより、表のパーティション数が1つ削減されています。

ALTER TABLE ouu1
     COALESCE PARTITION;

* - ハッシュ・パーティション表でのサブパーティションの結合

次の文により、パーティションus_locationsのサブパーティションのコンテンツが、同じパーティションの1つ以上の残りのサブパーティション(ハッシュ関数で決定)に分散されます。時間隔パーティション表の場合、結合できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのハッシュ・サブパーティションのみです。基本的に、この操作は、「* - ハッシュ・パーティション表へのサブパーティションの追加」で説明したMODIFY PARTITION ... ADD SUBPARTITION句の逆の操作です。

ALTER TABLE diving MODIFY PARTITION us_locations
     COALESCE SUBPARTITION;

ハッシュ・パーティション・グローバル索引の結合

ALTER INDEXCOALESCE PARTITION句を使用して、ハッシュ・パーティション・グローバル索引の索引パーティション数を1つ減らすようにデータベースに指示できます。データベースにより、ハッシュ・パーティションの要件に基づいて、結合するパーティションが選択されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」で作成されたhgidx索引のパーティション数が1つ削減されます。

ALTER INDEX hgidx COALESCE PARTITION;

パーティションの削除

レンジ、時間隔、リストまたはコンポジット* - [レンジ | リスト]パーティション表からパーティションを削除できます。時間隔パーティション表の場合は、マテリアライズ化されたレンジまたは時間隔パーティションのみ削除できます。ハッシュ・パーティション表またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションの場合は、かわりに、結合操作を実行する必要があります。

参照パーティション表からパーティションを削除することはできません。かわりに、親表での削除操作がすべての子表にカスケードされます。

表パーティションの削除

表パーティションまたはサブパーティションを削除するには、次のいずれかの文を使用します。

  • ALTER TABLE ... DROP PARTITION: 表パーティションを削除する場合

  • ALTER TABLE ... DROP SUBPARTITION: コンポジット* - [レンジ | リスト]パーティション表のサブパーティションを削除する場合

パーティション内のデータを保持するには、DROP PARTITION文ではなくMERGE PARTITION文を使用します。

表にローカル索引が定義されている場合、この文では、ローカル索引からも一致するパーティションまたはサブパーティションが削除されます。次のいずれかが当てはまる場合、すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされます。

  • UPDATE INDEXESを指定する(索引構成表には指定できません。かわりにUPDATE GLOBAL INDEXESを使用してください)。

  • 削除するパーティションまたはそのサブパーティションが空である。


    注意:

    • 表にパーティションが1つだけ含まれる場合、そのパーティションは削除できません。かわりに表を削除する必要があります。

    • 時間隔パーティション表または時間隔 - *コンポジット・パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。


次の項では、表パーティションの削除に関するいくつかのシナリオを示します。

データおよびグローバル索引を含む表からのパーティションの削除

パーティションにデータが含まれている場合や、表に1つ以上のグローバル索引が定義されている場合には、次のいずれかの方法を使用して表パーティションを削除します。

方法1

ALTER TABLE ... DROP PARTITION文の実行中は、グローバル索引はそのままにします。その後、索引(または索引パーティション)がUNUSABLEとマークされるため、(パーティション化されているかどうかに関係なく)すべてのグローバル索引を再作成する必要があります。次の文で、sales表からパーティションdec98を削除し、パーティション化されていないグローバル索引を再作成する例を示します。

ALTER TABLE sales DROP PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;

索引sales_area_ixがレンジ・パーティション・グローバル索引の場合には、その索引のすべてのパーティションを再作成する必要があります。さらに、1文で索引のすべてのパーティションを再作成することはできません。索引の各パーティションに対して、別々にREBUILD文を発行する必要があります。次の文では、索引パーティションjan99_ixfeb99_ixmar99_ixからdec99_ixを再作成します。

ALTER INDEX sales_area_ix REBUILD PARTITION jan99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION feb99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION mar99_ix;
...
ALTER INDEX sales_area_ix REBUILD PARTITION dec99_ix;

これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。

方法2

ALTER TABLE ... DROP PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除します。DELETE文により、グローバル索引が更新されます。

たとえば、最初のパーティションを削除するには、次の文を発行します。

DELETE FROM sales partition (dec98);
ALTER TABLE sales DROP PARTITION dec98;

これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

方法3

ALTER TABLE文にUPDATE INDEXESを指定します。これにより、パーティションの削除時にグローバル索引が更新されます。

ALTER TABLE sales DROP PARTITION dec98
     UPDATE INDEXES;

データおよび参照整合性制約を含むパーティションの削除

パーティションにデータが含まれ、表に参照整合性制約がある場合には、次のいずれかの方法を選択して表パーティションを削除します。この表にあるのはローカル索引のみであるため、索引を再作成する必要はありません。

方法1

削除するパーティションのデータを参照しているデータがない場合は、参照表の整合性制約を無効化してALTER TABLE ... DROP PARTITION文を発行し、整合性制約を再度有効化します。

これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。削除するパーティションのデータを参照するデータがある場合には、参照元のすべてのデータを削除して、参照整合性制約を再度有効化できるようにしてください。

方法2

参照表にデータがある場合は、ALTER TABLE ... DROP PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除できます。DELETE文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。ON DELETE CASCADEオプションを指定して制約を作成すると削除が成功し、参照表からもすべての行が削除されます。

DELETE FROM sales partition (dec94);
ALTER TABLE sales DROP PARTITION dec94;

これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

時間隔パーティションの削除

時間隔パーティション表の時間隔パーティションを削除できます。この操作により、その時間隔のデータのみが削除され、時間隔定義はそのまま残ります。削除されたばかりの時間隔にデータが挿入された場合は、データベースにより時間隔パーティションが再度作成されます。

時間隔パーティション表のレンジ・パーティションも削除できます。時間隔パーティション表のレンジ・パーティションを削除するルールは、レンジ・パーティション表のレンジ・パーティションの削除ルールと同じです。一連のレンジ・パーティションの中間にあるレンジ・パーティションを削除すると、次のレンジ・パーティションの下限が、削除したレンジ・パーティションの下限に切り替わります。時間隔パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。

次の例では、sales表から2007年9月の時間隔パーティション表を削除します。ローカル索引しかないため、索引は無効化されません。

ALTER TABLE sales DROP PARTITION FOR(TO_DATE('01-SEP-2007','dd-MON-yyyy'));

索引パーティションの削除

ローカル索引のパーティションは明示的に削除できません。かわりに、基礎となる表からパーティションを削除した場合にのみ、ローカル索引パーティションが削除されます。

グローバル索引パーティションが空の場合は、ALTER INDEX ... DROP PARTITION文を発行することでそのパーティションを明示的に削除できます。ただし、グローバル索引パーティションにデータが含まれる場合は、パーティションを削除すると次の最高位パーティションがUNUSABLEとマークされる原因になります。たとえば、索引パーティションP1を削除する必要があり、P2が次の最高位パーティションであるとします。次の文を発行する必要があります。

ALTER INDEX npr DROP PARTITION P1;
ALTER INDEX npr REBUILD PARTITION P2;

注意:

グローバル索引では、最高位パーティションを削除できません。

パーティションの交換

データ・セグメントを交換することで、パーティション(またはサブパーティション)を非パーティション表に、非パーティション表をパーティション表のパーティション(またはサブパーティション)に変換できます。ハッシュ・パーティション表をコンポジット* - ハッシュ・パーティション表のパーティションに変換することも、コンポジット* - ハッシュ・パーティション表のパーティションをハッシュ・パーティション表に変換することも可能です。同様に、[レンジ | リスト]パーティション表をコンポジット* - [レンジ | リスト]パーティション表のパーティションに変換することも、コンポジット* - [レンジ | リスト]パーティション表のパーティションを[レンジ | リスト]パーティション表に変換することも可能です。

表パーティションの交換は、非パーティション表を使用するアプリケーションがあり、その表をパーティション表のパーティションに変換する必要がある場合にとても便利です。たとえば、データ・ウェアハウス環境で、パーティションの交換を行うと、新しい増分データの既存のパーティション表への高速データ・ローディングが容易になります。一般的に、OLTP環境やデータ・ウェアハウス環境では、パーティション表の古いデータ・パーティションを交換することで利点が得られます。実際には削除されずにパーティション表からデータがパージされ、後から個別にアーカイブできます。

パーティションを交換すると、ロギング属性が保持されます。ローカル索引も交換するかどうか(INCLUDING INDEXES句)、および行が適切にマッピングされていることを検証するかどうか(WITH VALIDATION句)をオプションで指定できます。


注意:

パーティションの交換操作にWITHOUT VALIDATIONを指定する場合、これに関連するのはデータ・ディクショナリの更新のみであるため、通常は高速な操作です。ただし、交換操作に関連する表またはパーティション表に主キーがある場合や一意制約が有効化されている場合には、制約の整合性を維持するため、交換操作はWITH VALIDATIONが指定されているように実行されます。

この検証アクティビティのオーバーヘッドを避けるには、パーティションの交換操作を実行する前に、各制約に対して次の文を発行します。

ALTER TABLE table_name
     DISABLE CONSTRAINT constraint_name KEEP INDEX

交換後に制約を有効化します。

WITHOUT VALIDATIONを指定する場合は、交換するデータが交換するパーティションに含まれることを確認する必要があります。


UPDATE INDEXESを指定しないかぎり、パーティションを交換する表のグローバル索引またはすべてのグローバル索引パーティションが、データベースによりUNUSABLEとマークされます。交換が行われる表のグローバル索引またはグローバル索引パーティションは、無効化されたままになります。(索引構成表にはUPDATE INDEXESは使用できません。かわりにUPDATE GLOBAL INDEXESを使用してください)。

詳細は、「パーティション表および索引の情報の表示」を参照してください。

レンジ、ハッシュまたはリスト・パーティションの交換

レンジ、ハッシュまたはリスト・パーティション表のパーティションを非パーティション表と交換する場合、またはその逆を行う場合は、ALTER TABLE ... EXCHANGE PARTITION文を使用します。パーティションを非パーティション表に変換する例を次に示します。この例では、表stocksをレンジ、ハッシュまたはリスト・パーティション化できます。

ALTER TABLE stocks
    EXCHANGE PARTITION p3 WITH TABLE stock_table_3;

時間隔パーティション表のパーティションの交換

時間隔パーティション表の時間隔パーティションを交換できます。ただし、パーティションを交換する前に、時間隔パーティションが作成されていることを確認する必要があります。時間隔パーティションをロックすることで、データベースによりパーティションが作成されます。

次の例では、2004年1月1日現在に、月単位のパーティションを使用して時間隔パーティション化された、interval_sales表のパーティションの交換を示します。この例では、パーティション交換ロードを使用して、表に2007年6月のデータを追加する方法を示します。interval_sales表にはローカル索引のみがあり、interval_sales_june_2007表に対応する索引が作成されているとします。

LOCK TABLE interval_sales
PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
IN SHARE MODE;

ALTER TABLE interval_sales
EXCHANGE PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
WITH TABLE interval_sales_jun_2007
INCLUDING INDEXES;

システム生成されたパーティションを識別するためのFOR構文の使用方法に注意してください。*_TAB_PARTITIONSデータ・ディクショナリ・ビューを問い合せることで、システム生成のパーティション名の検出にパーティション名を使用できます。

参照パーティション表のパーティションの交換

参照パーティション表のパーティションを交換できますが、参照するデータが親表のそれぞれのパーティションで使用可能であることを確認する必要があります。

例4-30では、レンジ・パーティション化されたorders表、および参照パーティション化されたorder_items表のパーティション交換ロードのシナリオを示します。order_items_dec_2006表のデータには、order_dateが2006年12月の注文の注文アイテム・データのみが含まれていることに注意してください。

例4-30 レンジ・パーティション表のパーティションの交換

ALTER TABLE orders
EXCHANGE PARTITION p_2006_dec
WITH TABLE orders_dec_2006
UPDATE GLOBAL INDEXES;

ALTER TABLE order_items_dec_2006
ADD CONSTRAINT order_items_dec_2006_fk
FOREIGN KEY (order_id)
REFERENCES orders(order_id) ;

ALTER TABLE order_items
EXCHANGE PARTITION p_2006_dec
WITH TABLE order_items_dec_2006;

主キー索引を使用可能なままにするには、親表のパーティションの交換では、UPDATE GLOBAL INDEXESまたはUPDATE INDEXESを使用する必要があります。また、参照パーティション表でのパーティションの交換を正常に行うには、order_items_dec_2006表で外部キー制約を作成するか有効化する必要があります。

仮想列を含む表のパーティションの交換

仮想列が存在する場合もパーティションを交換できます。仮想列を含むパーティション表でパーティションの交換を正常に行うには、パーティション表の単一のパーティションにある仮想列以外のすべての列の定義に一致する表を作成する必要があります。仮想列に制約または索引が定義されている場合を除き、仮想列の定義を含める必要はありません。

定義されている場合は、パーティション表の制約および索引の定義に一致させるために、仮想列の定義を含める必要があります。このシナリオは、仮想列ベースのパーティション表にも適用されます。

ハッシュ・パーティション表と* - ハッシュ・パーティションの交換

この例では、すべてのパーティションを含むハッシュ・パーティション表全体を、* - ハッシュ・パーティション表のパーティションおよびそのすべてのハッシュ・サブパーティションと交換します。次の例では、レンジ - ハッシュ・パーティション表のこの概念を説明します。

まず、ハッシュ・パーティション表を作成します。

CREATE TABLE t1 (i NUMBER, j NUMBER)
     PARTITION BY HASH(i)
       (PARTITION p1, PARTITION p2);

表に移入し、次のようにしてレンジ - ハッシュ・パーティション表を作成します。

CREATE TABLE t2 (i NUMBER, j NUMBER)
     PARTITION BY RANGE(j)
     SUBPARTITION BY HASH(i)
        (PARTITION p1 VALUES LESS THAN (10)
            SUBPARTITION t2_pls1
            SUBPARTITION t2_pls2,
         PARTITION p2 VALUES LESS THAN (20)
            SUBPARTITION t2_p2s1
            SUBPARTITION t2_p2s2));

t1のパーティション化キーが、表t2のサブパーティション化キーと同一であることが重要です。

t1のデータをt2に移行して行を検証するには、次の文を使用します。

ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1
     WITH VALIDATION;

* - ハッシュ・パーティション表のサブパーティションの交換

* - ハッシュ・パーティション表のハッシュ・サブパーティションを非パーティション表に変換する場合、またはその逆を行う場合は、ALTER TABLE ... EXCHANGE SUBPARTITION文を使用します。次の例では、表salesのサブパーティションq3_1999_s1を、非パーティション表q3_1999に変換します。ローカル索引パーティションは、q3_1999の対応する索引と交換されます。

ALTER TABLE sales EXCHANGE SUBPARTITION q3_1999_s1
      WITH TABLE q3_1999 INCLUDING INDEXES;

リスト・パーティション表と* - リスト・パーティションの交換

ALTER TABLE ... EXCHANGE PARTITION文のセマンティックは、「ハッシュ・パーティション表と* - ハッシュ・パーティションの交換」で説明されているセマンティックと同じです。次の例では、リスト - リスト・パーティション表のパーティションの交換シナリオを示します。

CREATE TABLE customers_apac
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (credit_rating)
( PARTITION poor VALUES ('P')
, PARTITION mediocre VALUES ('C')
, PARTITION good VALUES ('G')
, PARTITION excellent VALUES ('E')
);

表にAPACの顧客を移入します。次に、リスト - リスト・パーティション表を作成します。

CREATE TABLE customers
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (region)
SUBPARTITION BY LIST (credit_rating)
SUBPARTITION TEMPLATE
( SUBPARTITION poor VALUES ('P')
, SUBPARTITION mediocre VALUES ('C')
, SUBPARTITION good VALUES ('G')
, SUBPARTITION excellent VALUES ('E')
)
(PARTITION americas VALUES ('AMER')
, PARTITION emea VALUES ('EMEA')
, PARTITION apac VALUES ('APAC')
);

customers_apac表のパーティション化キーが、customers表のサブパーティション化キーと一致していることが重要です。

次に、apacパーティションを交換します。

ALTER TABLE customers
EXCHANGE PARTITION apac
WITH TABLE customers_apac
WITH VALIDATION;

* - リスト・パーティション表のサブパーティションの交換

ALTER TABLE ... EXCHANGE SUBPARTITION文のセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。

レンジ・パーティション表と* - レンジ・パーティションの交換

ALTER TABLE ... EXCHANGE PARTITION文のセマンティックは、「ハッシュ・パーティション表と* - ハッシュ・パーティションの交換」で説明されているセマンティックと同じです。次の例では、order_dateで時間隔パーティション化され、order_totalのレンジでサブパーティション化されたorders表を示します。この例では、単一の月単位の時間隔をレンジ・パーティション表と交換する方法を示します。

CREATE TABLE orders_mar_2007
( id          NUMBER
, cust_id     NUMBER
, order_date  DATE
, order_total NUMBER
)
PARTITION BY RANGE (order_total)
( PARTITION p_small VALUES LESS THAN (1000)
, PARTITION p_medium VALUES LESS THAN (10000)
, PARTITION p_large VALUES LESS THAN (100000)
, PARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
);

表に2007年5月の注文を移入します。次に時間隔 - レンジ・パーティション表を作成します。

CREATE TABLE orders
( id          NUMBER
, cust_id     NUMBER
, order_date  DATE
, order_total NUMBER
)
PARTITION BY RANGE (order_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
  SUBPARTITION BY RANGE (order_total)
  SUBPARTITION TEMPLATE
  ( SUBPARTITION p_small VALUES LESS THAN (1000)
  , SUBPARTITION p_medium VALUES LESS THAN (10000)
  , SUBPARTITION p_large VALUES LESS THAN (100000)
  , SUBPARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
  )
(PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-
MON-yyyy')));

orders_mar_2007表のパーティション化キーが、orders表のサブパーティション化キーと一致していることが重要です。

次に、パーティションを交換します。時間隔パーティションを交換するため、まずパーティションをロックしてパーティションが作成されることを確認する必要があります。

LOCK TABLE orders PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) 
IN SHARE MODE;

ALTER TABLE orders
EXCHANGE PARTITION
FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
WITH TABLE orders_mar_2007
WITH VALIDATION;

* - レンジ・パーティション表のサブパーティションの交換

ALTER TABLE ... EXCHANGE SUBPARTITION文のセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。

パーティションのマージ

2つのパーティションのコンテンツを1つのパーティションにマージするには、ALTER TABLE ... MERGE PARTITION文を使用します。元の2つのパーティションと、対応するローカル索引は削除されます。この文は、ハッシュ・パーティション表、またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションには使用できません。

参照パーティション表のパーティションはマージできません。かわりに、親表でのマージ操作がすべての子表にカスケードされます。ただし、パーティションまたはサブパーティションをマージするために、マスター表でマージ操作を発行する場合は、DEPENDENT TABLES句を使用して依存表に特定のプロパティを設定できます。


関連項目:

『Oracle Database SQL言語リファレンス』

関連するパーティションまたはサブパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作
通常(ヒープ) ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:
  • データベースにより、対応する結果のローカル索引パーティションまたはサブパーティションがすべてUNUSABLEとマークされます。

  • グローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成
  • データベースにより、対応する結果のローカル索引パーティションがすべてUNUSABLEとマークされます。
  • すべてのグローバル索引は使用可能なままです。


レンジ・パーティションのマージ

隣接する2つのレンジ・パーティションのコンテンツを、1つのパーティションにマージできます。隣接しないレンジ・パーティションはマージできません。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。

レンジ・パーティションをマージする理由の1つは、大規模なパーティションで、履歴データをオンラインに保つためです。たとえば、最も古いパーティションが週次パーティションにロールアップされ、そのパーティションは月次パーティションにロールアップされる日次パーティションを作成できます。

例4-31は、レンジ・パーティションのマージ例を示します。

例4-31 レンジ・パーティションのマージ

-- First, create a partitioned table with four partitions, each on its own
-- tablespace partitioned by range on the data column
--
CREATE TABLE four_seasons
( 
        one DATE,
        two VARCHAR2(60),
        three NUMBER
)
PARTITION  BY RANGE ( one ) 
(
PARTITION quarter_one 
   VALUES LESS THAN ( TO_DATE('01-apr-1998','dd-mon-yyyy'))
   TABLESPACE quarter_one,
PARTITION quarter_two 
   VALUES LESS THAN ( TO_DATE('01-jul-1998','dd-mon-yyyy'))
   TABLESPACE quarter_two,
PARTITION quarter_three
   VALUES LESS THAN ( TO_DATE('01-oct-1998','dd-mon-yyyy'))
   TABLESPACE quarter_three,
PARTITION quarter_four
   VALUES LESS THAN ( TO_DATE('01-jan-1999','dd-mon-yyyy'))
   TABLESPACE quarter_four
);
-- 
-- Create local PREFIXED index on Four_Seasons
-- Prefixed because the leftmost columns of the index match the
-- Partitioning key 
--
CREATE INDEX i_four_seasons_l ON four_seasons ( one,two ) 
LOCAL ( 
PARTITION i_quarter_one TABLESPACE i_quarter_one,
PARTITION i_quarter_two TABLESPACE i_quarter_two,
PARTITION i_quarter_three TABLESPACE i_quarter_three,
PARTITION i_quarter_four TABLESPACE i_quarter_four
);

-- Next, merge the first two partitions 
ALTER TABLE four_seasons 
MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two
UPDATE INDEXES;

この文からUPDATE INDEXES句を除外した場合は、影響を受けるパーティションのローカル索引を再作成する必要があります。

-- Rebuild index for quarter_two, which has been marked unusable 
-- because it has not had all of the data from Q1 added to it.
-- Rebuilding the index corrects this.
--
ALTER TABLE four_seasons MODIFY PARTITION 
quarter_two REBUILD UNUSABLE LOCAL INDEXES;

時間隔パーティションのマージ

隣接する2つの時間隔パーティションのコンテンツを、1つのパーティションにマージできます。隣接しない時間隔パーティションはマージできません。また、最初の時間隔パーティションは、最高位のレンジ・パーティションとマージできます。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。

時間隔パーティションをマージすると、遷移点が、マージされた2つのパーティションの高い方の上限に移動します。その結果、時間隔パーティション表のレンジ・セクションが、マージされた2つのパーティションの上限に拡張されます。新しくマージされたパーティションより上限が低いマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義されたレンジ・パーティションに自動的に変換されます。

次の時間隔パーティション表transactionsを例にあげます。

CREATE TABLE transactions
( id               NUMBER
, transaction_date DATE
, value            NUMBER
)
PARTITION BY RANGE (transaction_date)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));

表の時間隔セクションにデータを挿入します。これにより、これらの日付用の時間隔パーティションが作成されます。2007年1月15日および2007年1月16日は、隣接する時間隔パーティションに格納されます。

INSERT INTO transactions VALUES (1,TO_DATE('15-JAN-2007','dd-MON-yyyy'),100);
INSERT INTO transactions VALUES (2,TO_DATE('16-JAN-2007','dd-MON-yyyy'),600); 
INSERT INTO transactions VALUES (3,TO_DATE('30-JAN-2007','dd-MON-yyyy'),200);

次に、隣接する2つの時間隔パーティションをマージします。新しいパーティションには、システム生成の名前が付けられます。

ALTER TABLE transactions
MERGE PARTITIONS FOR(TO_DATE('15-JAN-2007','dd-MON-yyyy'))
, FOR(TO_DATE('16-JAN-2007','dd-MON-yyyy'));

transactions表の遷移点が2007年1月17日に移動します。時間隔パーティション表のレンジ・セクションには、値が2007年1月1日より少ないものと、2007年1月17日より少ないものの、2つのレンジ・パーティションが含まれます。2007年1月17日より大きい値は、時間隔パーティション表の時間隔部分に分類されます。

リスト・パーティションのマージ

リスト・パーティションをマージする場合、マージするパーティションは任意の2つのパーティションでかまいません。リスト・パーティション化ではパーティションの順序が想定されていないため、レンジ・パーティションのように隣接している必要はありません。結果のパーティションには、元の2つのパーティションのすべてのデータが含まれます。デフォルトのリスト・パーティションをその他のパーティションとマージすると、結果のパーティションがデフォルトのパーティションになります。

次の文では、リスト・メソッドを使用してパーティション化された表の2つのパーティションを、すべての属性を表レベルのデフォルト属性から継承するパーティションにマージします。文にはMAXEXTENTSが指定されています。

ALTER TABLE q1_sales_by_region 
   MERGE PARTITIONS q1_northcentral, q1_southcentral 
   INTO PARTITION q1_central 
      STORAGE(MAXEXTENTS 20);

元の2つのパーティションの値リストは、次のとおりです。

PARTITION q1_northcentral VALUES ('SD','WI')
PARTITION q1_southcentral VALUES ('OK','TX')

結果として生成されるsales_westパーティションの値リストは、これら2つのパーティションの値リストを合せたものです。つまり、次のようになります。

('SD','WI','OK','TX')

* - ハッシュ・パーティションのマージ

* - ハッシュ・パーティションをマージすると、サブパーティションが、SUBPARTITIONS nまたはSUBPARTITION句で指定されたサブパーティション数に再度ハッシュされます。どちらも含まれない場合、表レベルのデフォルトが使用されます。

2つの* - ハッシュ・パーティションをマージする場合とは対照的に、* - ハッシュ・パーティションを分割する場合(「* - ハッシュ・パーティションの分割」を参照)は、プロパティの継承方法が異なることに注意してください。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションをマージする場合は、表レベルからプロパティを継承する必要があります。

時間隔 - ハッシュ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。「時間隔パーティションのマージ」に説明されているように、時間隔 - ハッシュ・パーティション表で時間隔をマージすると遷移点が移動します。

次の例では、2つのレンジ - ハッシュ・パーティションをマージします。

ALTER TABLE all_seasons
   MERGE PARTITIONS quarter_1, quarter_2 INTO PARTITION quarter_2
   SUBPARTITIONS 8;

* - リスト・パーティションのマージ

パーティションはパーティション・レベルで、サブパーティションはリスト・サブパーティション・レベルでマージできます。

* - リスト・パーティション表のパーティションのマージ

* - リスト・パーティション表のパーティションのマージは、「レンジ・パーティションのマージ」で説明されている内容と同様です。ただし、2つの* - リスト・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、新しいパーティションに単一のデフォルトのサブパーティションが作成されます。

時間隔 - リスト・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。「時間隔パーティションのマージ」に説明されているように、時間隔 - リスト・パーティション表で時間隔をマージすると遷移点が移動します。

次の文では、レンジ - リスト・パーティション化されたstripe_regional_sales表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。

ALTER TABLE stripe_regional_sales
   MERGE PARTITIONS q1_1999, q2_1999 INTO PARTITION q1_q2_1999
      STORAGE(MAXEXTENTS 20);

指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。結果の新しいパーティションq1_q2_1999は、パーティションq2_1999の上限値と、表のサブパーティション・テンプレートの説明からサブパーティションの値リストの説明を継承しています。

結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。

  • マージされたサブパーティションの一部のリテラル値がサブパーティション・テンプレートに含まれていない。

  • サブパーティション・テンプレートにデフォルトのパーティション定義が含まれていない。

このエラー条件は、デフォルトのサブパーティション・テンプレートに必ずデフォルトのパーティションを指定することでなくすことができます。

* - リスト・パーティション表のサブパーティションのマージ

同じパーティションに所属する2つの任意のリスト・サブパーティションのコンテンツをマージできます。結果のサブパーティションの値リストの記述子には、マージされるパーティションの値リストのすべてのリテラル値が含まれます。

次の文では、レンジ - リスト・メソッドを使用してパーティション化された表の2つのサブパーティションを、表領域ts4に配置された新しいサブパーティションにマージします。

ALTER TABLE quarterly_regional_sales
   MERGE SUBPARTITIONS q1_1999_northwest, q1_1999_southwest
      INTO SUBPARTITION q1_1999_west
         TABLESPACE ts4;

元の2つのパーティションの値リストは、次のとおりです。

  • サブパーティションq1_1999_northwest('WA','OR')

  • サブパーティションq1_1999_southwest('AZ','NM','UT')

結果のサブパーティションの値リストは、次に示すように、これら2つのサブパーティションの値リストを合せたセットで構成されます。

  • サブパーティションq1_1999_westの値リストは('WA','OR','AZ','NM','UT')

結果のサブパーティションが配置されている表領域およびサブパーティションの属性は、明示的に指定されている場合を除き、パーティション・レベルのデフォルト属性によって決定されます。既存のサブパーティション名を再利用する場合、新しいサブパーティションは、名前が再利用されるサブパーティションのサブパーティション属性を継承します。

* - レンジ・パーティションのマージ

パーティションはパーティション・レベルで、サブパーティションはレンジ・サブパーティション・レベルでマージできます。

* - レンジ・パーティション表のパーティションのマージ

* - レンジ・パーティション表のパーティションのマージは、「レンジ・パーティションのマージ」で説明されている内容と同様です。ただし、2つの* - レンジ・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、上限がMAXVALUEの単一のサブパーティションが新しいパーティションに作成されます。

時間隔 - レンジ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。「時間隔パーティションのマージ」に説明されているように、時間隔 - レンジ・パーティション表で時間隔をマージすると遷移点が移動します。

次の文では、月次の時間隔 - レンジでパーティション化されたorders表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。

ALTER TABLE orders
MERGE PARTITIONS FOR(TO_DATE('01-MAR-2007','dd-MON-yyyy')), 
FOR(TO_DATE('01-APR-2007','dd-MON-yyyy'))
INTO PARTITION p_pre_may_2007;

2007年3月および2007年4月のパーティションが時間隔 - レンジ・パーティション表の時間隔セクションにある場合、マージ操作により、遷移点が2007年5月1日に移動します。

パーティションp_pre_may_2007のサブパーティションは、サブパーティション・テンプレートからプロパティを継承します。結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。

  • マージされたサブパーティションの一部のレンジ値がサブパーティション・テンプレートに含まれていない。

  • サブパーティション・テンプレートに、上限がMAXVALUEのサブパーティションの定義がない。

このエラー条件は、上限がMAXVALUEのサブパーティションをサブパーティション・テンプレートに必ず指定することでなくすことができます。

デフォルト属性の変更

表またはコンポジット・パーティション表のパーティションのデフォルト属性を変更できます。デフォルト属性を変更する場合、新しい属性の影響を受けるのは、作成される今後のパーティションまたはサブパーティションのみです。新しいパーティションまたはサブパーティションの作成時には、デフォルト値を明示的に上書きできます。参照パーティション表のデフォルト属性を変更できます。

表のデフォルト属性の変更

ALTER TABLEMODIFY DEFAULT ATTRIBUTES句を使用して、レンジ、ハッシュ、リスト、時間隔または参照パーティションに継承されるデフォルト属性を変更できます。

ハッシュ・パーティション表の場合、変更できるのはTABLESPACE属性のみです。

パーティションのデフォルト属性の変更

サブパーティションの作成時に継承されたデフォルト属性を変更するには、ALTER TABLE ... MODIFY DEFAULT ATTRIBUTES FOR PARTITIONを使用します。次の文では、レンジ - ハッシュ・パーティション表empのパーティションp1の後続のサブパーティションが配置されるTABLESPACEを変更します。

ALTER TABLE emp
     MODIFY DEFAULT ATTRIBUTES FOR PARTITION p1 TABLESPACE ts1;

TABLESPACEを除き、レンジ - ハッシュ・パーティション表のすべてのサブパーティションでは同じ属性を共有する必要があるため、これは変更できる唯一の属性です。

作成されていない時間隔パーティションのデフォルト属性は変更できません。時間隔パーティション表の今後のサブパーティションの作成方法を変更するには、サブパーティション・テンプレートを変更する必要があります。

索引パーティションのデフォルト属性の変更

表パーティションと同じような方法で、レンジ・パーティション・グローバル索引のパーティション、またはパーティション表のローカル索引パーティションにより継承されるデフォルト属性を変更できます。これには、ALTER INDEX ... MODIFY DEFAULT ATTRIBUTES文を使用します。コンポジット・パーティション表のサブパーティションにより継承されるデフォルト属性を変更する場合は、ALTER INDEX ... MODIFY DEFAULT ATTRIBUTES FOR PARTITION文を使用します。

パーティションの実際の属性の変更

表または索引の既存のパーティションの属性を変更できます。

TABLESPACE属性は変更できません。新しい表領域にパーティションまたはサブパーティションを移動する場合は、ALTER TABLE ... MOVE PARTITION/SUBPARTITIONを使用します。

レンジまたはリスト・パーティションの実際の属性の変更

レンジ・パーティションまたはリスト・パーティションの既存の属性を変更するには、ALTER TABLE ... MODIFY PARTITION文を使用します。セグメント属性(TABLESPACEを除く)の変更、エクステントの割当てや割当て解除、ローカル索引パーティションへのUNUSABLEのマーク付け、またはUNUSABLEとマークされたローカル索引の再作成が可能です。

* - ハッシュ・パーティション表のレンジ・パーティションの場合は、次の内容に注意してください。

  • エクステントの割当てまたは割当て解除を行うと、このアクションは指定されたパーティションのすべてのサブパーティションに対して実行されます。

  • 同様に、その他の属性を変更した場合も、対応する変更がそのパーティションのすべてのサブパーティションの属性に対して行われます。パーティション・レベルのデフォルト属性も変更されます。既存のサブパーティションの属性が変更されないようにするには、MODIFY DEFAULT ATTRIBUTES文のFOR PARTITION句を使用します。

次に、パーティションの実際の属性の変更例をいくつか示します。

この例では、表salesのレンジ・パーティションsales_q1MAXEXTENTS記憶域属性を変更します。

ALTER TABLE sales MODIFY PARTITION sales_q1
     STORAGE (MAXEXTENTS 10); 

次の例では、レンジ - ハッシュ・パーティション表scubagearのパーティションts1のローカル索引サブパーティションがすべてUNUSABLEとマークされます。

ALTER TABLE scubagear MODIFY PARTITION ts1 UNUSABLE LOCAL INDEXES;

時間隔パーティション表の場合、変更できるのは、作成済のレンジ・パーティションまたは時間隔パーティションの実際の属性のみです。

ハッシュ・パーティションの実際の属性の変更

ハッシュ・パーティションの属性を変更するには、 ALTER TABLE ... MODIFY PARTITION文も使用します。ただし、個々のハッシュ・パーティションの物理属性は(TABLESPACEを除き)すべて同一である必要があるため、実行できるのは次の操作のみです。

  • 新規エクステントの割当て

  • 未使用のエクステントの割当て解除

  • ローカル索引サブパーティションへのUNUSABLEのマーク付け

  • UNUSABLEとマークされたローカル索引サブパーティションの再作成

次の例では、表deptのハッシュ・パーティションP1に関連付けられた使用できないローカル索引パーティションを再作成します。

ALTER TABLE dept MODIFY PARTITION p1
     REBUILD UNUSABLE LOCAL INDEXES;

サブパーティションの実際の属性の変更

ALTER TABLEMODIFY SUBPARTITION句を使用すると、前の項でパーティションに関してリストされていたのと同じアクションを実行できますが、実行できるのは、特定のコンポジット・パーティション表のサブパーティション・レベルにおいてです。次に例を示します。

ALTER TABLE emp MODIFY SUBPARTITION p3_s1
     REBUILD UNUSABLE LOCAL INDEXES;

索引パーティションの実際の属性の変更

ALTER INDEXMODIFY PARTITION句を使用すると、索引のパーティションまたはサブパーティションの実際の属性を変更できます。ルールは表パーティションのルールとよく似ています。ALTER INDEXMODIFY PARTITION句とは異なり、使用不可の索引パーティションを作成する副句はありませんが、索引のパーティションまたはサブパーティションを結合する副句があります。ここでの結合は索引ブロックのマージを意味します。これは再利用のために解放できます。

MODIFY PARTITION句を使用して、ローカル索引のサブパーティションに対する記憶域の割当てや割当て解除、またはそれらをUNUSABLEとマークすることもできます。

リスト・パーティションの変更: 値の追加

リスト・パーティション化では、オプションで、定義された値リストのリテラル値を追加できます。

リスト・パーティションへの値の追加

既存のパーティションの値リストを拡張するには、ALTER TABLE文のMODIFY PARTITION ... ADD VALUES句を使用します。追加するリテラル値は、その他のパーティションの値リストに含まれていない必要があります。対応するローカル索引パーティションのパーティションの値リストはそれに応じて拡張され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。

次の文では、既存のパーティション・リストに、一連の新しい州コード(OKKS)を追加します。

ALTER TABLE sales_by_region
   MODIFY PARTITION region_south
      ADD VALUES ('OK', 'KS');

デフォルトのパーティションがあると、その他のパーティションへの値の追加時にパフォーマンスに影響があります。これは、リスト・パーティションに値を追加するために、追加する値がデフォルトのパーティションに存在しないことをデータベースで確認する必要があるためです。いずれかの値がデフォルト・パーティションに存在する場合は、エラーが表示されます。


注意:

データベースにより、追加されるリテラル値に対応する行がデフォルトのパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せの実行および操作全体が高速化されます。

デフォルトのリスト・パーティションには値を追加できません。

リスト・サブパーティションへの値の追加

この操作は、「リスト・パーティションの変更: 値の追加」に説明されている操作と基本的に同じですが、MODIFY PARTITION句ではなくMODIFY SUBPARTITION句を使用します。たとえば、サブパーティションq1_1999_southeastの値リストにあるリテラル値のレンジを拡張するには、次の文を使用します。

ALTER TABLE quarterly_regional_sales
   MODIFY SUBPARTITION q1_1999_southeast
      ADD VALUES ('KS');

追加するリテラル値が、所有パーティション内のその他のサブパーティションの値リストに含まれていない必要があります。ただし、表内にあるその他のパーティションのサブパーティションの値リストのリテラル値を複製したものであってもかまいません。

時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションにのみ値を追加できます。まだ作成されていない時間隔パーティションのサブパーティションに値を追加するには、サブパーティション・テンプレートを変更する必要があります。

リスト・パーティションの変更: 値の削除

リスト・パーティション化では、オプションで、定義された値リストのリテラル値を削除できます。

リスト・パーティションからの値の削除

既存のパーティションの値リストからリテラル値を削除するには、ALTER TABLE文のMODIFY PARTITION ... DROP VALUES句を使用します。この文は常に検証しながら実行されます。つまり、削除する一連の値に対応する行がパーティションに存在するかどうかが確認されます。そのような行が見つかると、データベースによってエラー・メッセージが返され、操作が失敗します。必要な場合は、DELETE文を使用して、対応する行を表から削除した後で値の削除を試行します。


注意:

パーティションを説明する値リストからすべてのリテラル値を削除することはできません。かわりに、ALTER TABLE ... DROP PARTITION文を使用してください。

対応するローカル索引パーティションのパーティションの値リストには新しい値リストが反映され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。

次の文では、既存のパーティションの値リストから、一連の州コード(OKおよびKS)を削除します。

ALTER TABLE sales_by_region
   MODIFY PARTITION region_south
      DROP VALUES ('OK', 'KS');

注意:

データベースにより、削除されるリテラル値に対応する行がパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せおよび操作全体が高速化されます。

デフォルトのリスト・パーティションからは値を削除できません。

リスト・サブパーティションからの値の削除

この操作は、「リスト・パーティションの変更: 値の削除」に説明されている操作と基本的に同じですが、MODIFY PARTITION句ではなくMODIFY SUBPARTITION句を使用します。たとえば、サブパーティションq1_1999_southeastの値リストにある一連のリテラル値を削除するには、次の文を使用します。

ALTER TABLE quarterly_regional_sales
   MODIFY SUBPARTITION q1_1999_southeast
      DROP VALUES ('KS');

時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションからのみ値を削除できます。まだ作成されていない時間隔パーティションのサブパーティションから値を削除するには、サブパーティション・テンプレートを変更する必要があります。

サブパーティション・テンプレートの変更

新しいサブパーティション・テンプレートと置き換えることで、コンポジット・パーティション表のサブパーティション・テンプレートを変更できます。サブパーティション・テンプレートを使用する後続の操作(ADD PARTITIONまたはMERGE PARTITIONSなど)で、新しいサブパーティション・テンプレートが使用されます。既存のサブパーティションは変更されません。

時間隔 - *コンポジット・パーティション表のサブパーティション・テンプレートを変更すると、作成されていない時間隔パーティションに新しいサブパーティション・テンプレートが使用されます。

新しいサブパーティション・テンプレートを指定するには、ALTER TABLE ... SET SUBPARTITION TEMPLATE文を使用します。次に例を示します。

ALTER TABLE emp_sub_template
   SET SUBPARTITION TEMPLATE
         (SUBPARTITION e TABLESPACE ts1,
          SUBPARTITION f TABLESPACE ts2,
          SUBPARTITION g TABLESPACE ts3,
          SUBPARTITION h TABLESPACE ts4
         );

空のリストを指定することで、サブパーティション・テンプレートを削除できます。

ALTER TABLE emp_sub_template
   SET SUBPARTITION TEMPLATE ( );

パーティションの移動

ALTER TABLE文のMOVE PARTITION句は、次のような場合に使用します。

  • データを再クラスタリングして断片化を減らす場合

  • 別の表領域にパーティションを移動する場合

  • 作成時属性を変更する場合

  • 表圧縮を使用してデータを圧縮形式で保存する場合

通常は、ALTER TABLE/INDEX ... MODIFY PARTITION文を使用して、一度にパーティションの物理記憶域属性を変更できます。ただし、TABLESPACEなどの一部の物理属性は、MODIFY PARTITIONを使用して変更できません。そのような場合には、MOVE PARTITION句を使用します。表圧縮などのその他の属性を変更すると、既存のデータではなく、後続の記憶域のみが影響されます。


注意:

ALTER TABLE...MOVEコマンドの実行中は、パーティションでDMLを使用することはできません。パーティションを移動する際にDML用にそのパーティションを使用可能なままにする場合は、「オンラインでのパーティションの再定義」を参照してください。

移動するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作
通常(ヒープ) ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:
  • 各ローカル索引の一致するパーティションはUNUSABLEとマークされます。MOVE PARTITIONの発行後にそれらの索引パーティションを再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされます。

索引構成 移動するパーティションに定義された任意のローカルまたはグローバル索引は、主キー・ベースの論理行IDであるため使用可能なままです。ただし、これらの行IDの不確定情報は不適切になります。

表パーティションの移動

パーティションを移動するには、MOVE PARTITION句を使用します。たとえば、(I/Oを調整するために)最もアクティブなパーティションをアクションは記録せずにデータを圧縮し、一連の独自のディスクに存在する表領域に移動するには、次の文を発行します。

ALTER TABLE parts MOVE PARTITION depot2
     TABLESPACE ts094 NOLOGGING COMPRESS;

この文では、新しい表領域を指定しない場合でも、古いパーティション・セグメントが削除され、新しいセグメントが作成されます。

パーティション化索引構成表のパーティションを移動する場合は、MOVE PARTITION句の一部としてMAPPING TABLE句を指定できます。これにより、マッピング表のパーティションは表パーティションとともに新しい場所に移動されます。

時間隔または時間隔 - *パーティション表の場合、移動できるのは、作成済のレンジ・パーティションまたは時間隔パーティションのみです。パーティションの移動操作では、時間隔または時間隔 - *パーティション表の遷移点は移動されません。

マスター表のパーティションには関係なく、参照パーティション表のパーティションを移動できます。

サブパーティションの移動

次の文では、表のサブパーティションにあるデータの移動方法を示します。この例では、PARALLEL句も指定されています。

ALTER TABLE scuba_gear MOVE SUBPARTITION bcd_types 
     TABLESPACE tbs23 PARALLEL (DEGREE 2);

マスター表のサブパーティションには関係なく、参照パーティション表のサブパーティションを移動できます。

索引パーティションの移動

通常の表に対してALTER TABLE ... MOVE PARTITION文を実行すると、グローバル索引のすべてのパーティションがUNUSABLEとマークされます。ALTER INDEX ... REBUILD PARTITION文を使用して各パーティションを再作成して、索引全体を再作成できます。これらの再作成は同時に実行できます。

単純に索引を削除して再作成することもできます。

オンラインでのパーティションの再定義

Oracle Databaseには、DMLに対するパーティションの可用性にそれほど影響を与えずに、パーティションの移動や、パーティションの物理構造にその他の変更を行うメカニズムがあります。このメカニズムはオンライン表再編成と呼ばれます。

表の単一パーティションの再定義の詳細は、『Oracle Database管理者ガイド』を参照してください。

コレクション表のパーティションの再定義

オンライン再定義を使用すると、非パーティション・コレクション表をパーティション・コレクション表にコピーできます。Oracle Databaseによって、コレクション表の該当するパーティションに行が挿入されます。例4-32は、Objects列内のネスト表でこの処理がどのように行われるかを示します。同様の例は、XMLType表または列内のOrdered Collection Type Tablesにも対応します。新たに定義するコレクション表で索引と制約を維持する場合は、copy_table_dependentsの操作で、索引と制約をコピーするために0またはfalseを指定することに注意してください。ただし、コレクション表とそのパーティションの名前は、暫定表(例4-32print_media2)のものと同じであることに注意することが重要です。コレクション表の名前を維持するために明示的な手順を実行する必要があります。

例4-32 コレクション表のパーティションの再定義

CONNECT / AS SYSDBA
DROP USER eqnt CASCADE;
CREATE USER eqnt IDENTIFIED BY eqnt;
GRANT CONNECT, RESOURCE TO eqnt;
 
-- Grant privleges required for online redefinition.
GRANT EXECUTE ON DBMS_REDEFINITION TO eqnt;
GRANT ALTER ANY TABLE TO eqnt;
GRANT DROP ANY TABLE TO eqnt;
GRANT LOCK ANY TABLE TO eqnt;
GRANT CREATE ANY TABLE TO eqnt;
GRANT SELECT ANY TABLE TO eqnt;
 
-- Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO eqnt;
GRANT CREATE ANY INDEX TO eqnt;
 
CONNECT eqnt/eqnt
 
CREATE TYPE textdoc_typ AS OBJECT ( document_typ VARCHAR2(32));
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/

-- (old) non partitioned nested table
CREATE TABLE print_media
    ( product_id        NUMBER(6) primary key
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
PARTITION BY RANGE (product_id)
(
    PARTITION P1 VALUES LESS THAN (10),
    PARTITION P2 VALUES LESS THAN (20)
);
 
-- Insert into base table
INSERT INTO print_media VALUES (1,
   textdoc_tab(textdoc_typ('xx'), textdoc_typ('yy')));
INSERT INTO print_media VALUES (11,
   textdoc_tab(textdoc_typ('aa'), textdoc_typ('bb')));
COMMIT;
 
-- Insert into nested table
INSERT INTO TABLE
  (SELECT p.ad_textdocs_ntab FROM print_media p WHERE p.product_id = 11)
   VALUES ('cc');
 
SELECT * FROM print_media;

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))
 
-- Creating partitioned Interim Table
CREATE TABLE print_media2
    ( product_id        NUMBER(6)
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab2
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
PARTITION BY RANGE (product_id)
(
    PARTITION P1 VALUES LESS THAN (10),
    PARTITION P2 VALUES LESS THAN (20)
);
 
EXEC dbms_redefinition.start_redef_table('eqnt', 'print_media', 'print_media2');
 
DECLARE
 error_count pls_integer := 0;
BEGIN
  dbms_redefinition.copy_table_dependents('eqnt', 'print_media', 'print_media2',
                                          0, true, false, true, false,
                                          error_count);
 
  dbms_output.put_line('errors := ' || to_char(error_count));
END;
/
 
EXEC  dbms_redefinition.finish_redef_table('eqnt', 'print_media', 'print_media2');
 
-- Drop the interim table
DROP TABLE print_media2;
 
-- print_media has partitioned nested table here

SELECT * FROM print_media PARTITION (p1);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))

SELECT * FROM print_media PARTITION (p2);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))

索引パーティションの再作成

次に、索引パーティションを再作成する理由をいくつか示します。

  • 領域のリカバリおよびパフォーマンスの向上

  • メディア障害により破損した索引パーティションの修復

  • SQL*Loaderまたはインポート・ユーティリティを使用して基礎となる表パーティションをロードした後のローカル索引パーティションの再作成

  • UNUSABLEとマークされた索引パーティションの再作成

  • Bツリー索引のキー圧縮の有効化

次の項では、索引パーティションおよびサブパーティションを再作成するためのオプションを説明します。

グローバル索引パーティションの再作成

グローバル索引パーティションは、2つの方法で再作成できます。

  • ALTER INDEX ... REBUILD PARTITION文を発行して各パーティションを再作成する方法(再作成は同時に実行できます)。

  • グローバル索引全体を削除して再作成する方法。表がスキャンされるのは一度のみであるため、この方法はより効率的です。

索引付きのパーティション表におけるほとんどのメンテナンス操作では、DDL文にUPDATE INDEXESを指定することにより、オプションで索引の再作成を回避できます。

ローカル索引パーティションの再作成

ALTER INDEXまたはALTER TABLEを使用し、次のようにしてローカル索引を再作成します。

  • ALTER INDEX ... REBUILD PARTITION/SUBPARTITION

    この文では、索引パーティションまたはサブパーティションが無条件に再作成されます。

  • ALTER TABLE ... MODIFY PARTITION/SUBPARTITION ... REBUILD UNUSABLE LOCAL INDEXES

    この文では、表のパーティションまたはサブパーティションに対する使用不可の索引がすべて検索され、それらが再作成されます。UNUSABLEとマークされた索引パーティションのみが再作成されます。

ALTER INDEXを使用したパーティションの再作成

ALTER INDEX ... REBUILD PARTITION文によって、索引の1つのパーティションが再作成されます。これは、コンポジット・パーティション表には使用できません。このコマンドで再作成できるのは実際の物理セグメントのみです。索引を再作成するとき、パーティションの新しい表領域への移動や属性の変更を選択することもできます。

コンポジット・パーティション表では、ALTER INDEX ... REBUILD SUBPARTITIONを使用して、索引のサブパーティションを再作成します。サブパーティションを別の表領域に移動するか、PARALLEL句を指定できます。次の文では、表のローカル索引のサブパーティションを再作成し、索引サブパーティションを別の表領域に移動します。

ALTER INDEX scuba
   REBUILD SUBPARTITION bcd_types
   TABLESPACE tbs23 PARALLEL (DEGREE 2);

ALTER TABLEを使用した索引パーティションの再作成

ALTER TABLE ... MODIFY PARTITIONREBUILD UNUSABLE LOCAL INDEXES句では、再作成される索引パーティションの新しい属性を指定できません。次の例では、表scubagearのパーティションP1の使用できないローカル索引パーティションを検出して再作成します。

ALTER TABLE scubagear
   MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;

使用できないローカル索引サブパーティションの再作成には、対応するALTER TABLE ... MODIFY SUBPARTITION句も使用できます。

パーティション名の変更

表と索引の両方のパーティションおよびサブパーティション名を変更できます。パーティション名を変更する理由の1つは、別のメンテナンス操作でパーティションに割り当てられたデフォルトのシステム名とは対照的に、意味のわかる名前を割り当てるためです。

すべてのパーティション化メソッドで、パーティションを識別するためのFOR(value)メソッドがサポートされています。このメソッドを使用して、システム生成されたパーティション名をより意味のわかりやすい名前に変更できます。これは、時間隔または時間隔 - *パーティショ表に特に便利です。

参照パーティション化されたマスター表および子表のパーティションやサブパーティション名を個別に変更できます。マスター表での名前の変更操作は、子表にカスケードされません。

表パーティション名の変更

ALTER TABLE ... RENAME PARTITION文を使用して、レンジ、ハッシュまたはリスト・パーティションの名前を変更できます。次に例を示します。

ALTER TABLE scubagear RENAME PARTITION sys_p636 TO tanks;

表サブパーティション名の変更

同様に、表のサブパーティションに新しい名前を割り当てられます。この場合は、ALTER TABLE ... RENAME SUBPARTITION構文を使用します。

索引パーティション名の変更

索引パーティションとサブパーティションの名前も類似の方法で変更できますが、ALTER INDEX構文を使用します。

索引パーティション名の変更

索引パーティション名を変更するには、ALTER INDEX ... RENAME PARTITION文を使用します。

ALTER INDEX文では、パーティションを識別するためのFOR(value)を使用できません。名前の変更操作では、元のパーティション名を使用する必要があります。

索引サブパーティション名の変更

次の文では、基礎となる表にパーティションを追加した結果、システム生成名が付けられたサブパーティションの名前を変更する方法を示します。

ALTER INDEX scuba RENAME SUBPARTITION sys_subp3254 TO bcd_types;

パーティションの分割

ALTER TABLEまたはALTER INDEX文のSPLIT PARTITION句は、パーティションのコンテンツを2つの新しいパーティションに再分散するために使用されます。パーティションが大きくなりすぎてバックアップ、リカバリまたはメンテナンス操作の完了に長い時間がかかるようになった場合や、単純にパーティションのデータが増えすぎた場合に、再分散を検討します。SPLIT PARTITION句を使用して、I/Oロードを再分散することもできます。この句は、ハッシュ・パーティションまたはサブパーティションには使用できません。

分割するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作
通常(ヒープ) ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:
  • データベースにより、各ローカル索引の(2つある)新しいパーティションがUNUSABLEとマークされます。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成
  • データベースにより、各ローカル索引の(2つある)新しいパーティションがUNUSABLEとマークされます。
  • すべてのグローバル索引は使用可能なままです。


参照パーティション表のパーティションまたはサブパーティションは分割できません。親表のパーティションまたはサブパーティションを分割すると、すべての子表にカスケードされます。ただし、パーティションまたはサブパーティションを分割するために、マスター表でSPLIT文を発行する場合は、DEPENDENT TABLES句を使用して依存表に特定のプロパティを設定できます。


関連項目:

『Oracle Database SQL言語リファレンス』

レンジ・パーティション表のパーティションの分割

ALTER TABLE ... SPLIT PARTITION文を使用して、レンジ・パーティションを分割します。パーティションの分割点である、パーティションのレンジ内のパーティション化キー列の値を指定します。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。

分割の結果である2つのパーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。

次の例のfee_katyは、表vet_catsのパーティションです。この表にはローカル索引jaf1があります。この表にはグローバル索引vetもあります。vetには2つのパーティションvet_partavet_partbが含まれます。

パーティションfee_katyを分割して索引パーティションを再作成するには、次の文を発行します。

ALTER TABLE vet_cats SPLIT PARTITION 
      fee_katy at (100) INTO ( PARTITION
      fee_katy1, PARTITION fee_katy2);
ALTER INDEX JAF1 REBUILD PARTITION fee_katy1;
ALTER INDEX JAF1 REBUILD PARTITION fee_katy2;
ALTER INDEX VET REBUILD PARTITION vet_parta;
ALTER INDEX VET REBUILD PARTITION vet_partb;

注意:

新しいパーティションの名前を指定しない場合、データベースにより、SYS_Pnという書式の名前が割り当てられます。データ・ディクショナリを調査して、新しいローカル索引パーティションに割り当てられた名前を検出できます。それらの名前を変更する必要がある場合もあります。指定しない属性は、元のパーティションから継承されます。

リスト・パーティション表のパーティションの分割

ALTER TABLE ... SPLIT PARTITION文を使用して、リスト・パーティションを分割します。SPLIT PARTITION句を使用すると、リテラル値のリストを指定してパーティションを定義できます。このパーティションに、対応するパーティション化キー値を含む行が挿入されます。元のパーティションのその他の行は、元のパーティションの残りの値が値リストに含まれる2番目のパーティションに挿入されます。分割の結果である2つのパーティションに、オプションで新しい属性を指定できます。

次の文では、パーティションregion_eastが2つのパーティションに分割されます。

ALTER TABLE sales_by_region 
   SPLIT PARTITION region_east VALUES ('CT', 'MA', 'MD') 
   INTO 
    ( PARTITION region_east_1 
         TABLESPACE tbs2,
      PARTITION region_east_2
        STORAGE (INITIAL 8M)) 
   PARALLEL 5;

元のregion_eastパーティションのリテラル値のリストは、次のように指定されています。

PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ')

2つの新しいパーティションは次のとおりです。

  • リテラル値のリストが('CT','MA','MD')region_east_1

  • 残りのリテラル値のリスト('NY','NH','ME','VA','PA','NJ')を継承しているregion_east_2

個々のパーティションには、パーティション・レベルで指定された新しい物理属性があります。操作は並列度5で実行されます。

その他のリスト・パーティションの分割と同じように、デフォルトのリスト・パーティションを分割できます。これは、デフォルトのパーティションがあるリスト・パーティション表にパーティションを追加する唯一の方法でもあります。デフォルトのパーティションを分割する際には、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを作成します。

次の例では、sales_by_regionのデフォルトのパーティションを分割し、それによって新しいパーティションを作成します。

ALTER TABLE sales_by_region 
   SPLIT PARTITION region_unknown VALUES ('MT', 'WY', 'ID') 
   INTO 
    ( PARTITION region_wildwest,
      PARTITION region_unknown);

時間隔パーティション表のパーティションの分割

時間隔パーティション表でALTER TABLE ... SPLIT PARTITION文を使用して、レンジまたはマテリアライズ化された時間隔パーティションを分割します。時間隔パーティション表のレンジ・パーティションの分割については、「レンジ・パーティション表のパーティションの分割」で説明しています。

マテリアライズ化された時間隔パーティションを分割するには、パーティションの分割点である、時間隔パーティション内のパーティション化キー列の値を指定します。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。パーティションの分割操作により、分割したパーティションの高い方の上限まで遷移点が移動され、新しく分割されたパーティションより小さいすべてのマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義された状態で、暗黙的にレンジ・パーティションに変換されます。

分割の結果である2つのレンジ・パーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。作成されていない時間隔パーティションは分割できません。

次の例では、月単位の時間隔パーティション表transactionsの2007年5月のパーティションを分割する方法を示します。

ALTER TABLE transactions
    SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy'))
    AT (TO_DATE('15-MAY-2007','dd-MON-yyyy'));

* - ハッシュ・パーティションの分割

これは、* - ハッシュ・パーティションのマージの逆の操作です。* - ハッシュ・パーティションを分割すると、新しいサブパーティションが、SUBPARTITIONSまたはSUBPARTITION句で指定されたサブパーティション数に再度ハッシュされます。または、そのような句が含まれていない場合、新しいパーティションは、分割されるパーティションのサブパーティション(および表領域)の数を継承します。

2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なることに注意してください。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションがマージされるとき、プロパティを表レベルのデフォルトから継承する必要があります。親が2つあり、新しいパーティションが片方を無視していずれか1つから継承することはできないためです。

次の例では、レンジ - ハッシュ・パーティションを分割します。

ALTER TABLE all_seasons SPLIT PARTITION quarter_1 
     AT (TO_DATE('16-dec-1997','dd-mon-yyyy'))
     INTO (PARTITION q1_1997_1 SUBPARTITIONS 4 STORE IN (ts1,ts3),
           PARTITION q1_1997­_2);

時間隔 - ハッシュ・パーティション表の分割のルールは、時間隔パーティション表の分割のルールと同じです。「時間隔パーティション表のパーティションの分割」に説明されているように、遷移点は分割されたパーティションの上限に変更されます。

* - リスト・パーティション表のパーティションの分割

パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で分割できます。

* - リスト・パーティションの分割

* - リスト・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのリテラル値のリストを指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。

次の例では、quarterly_regional_sales表のq1_1999パーティションを分割します。

ALTER TABLE quarterly_regional_sales SPLIT PARTITION q1_1999
   AT (TO_DATE('15-Feb-1999','dd-mon-yyyy'))
   INTO ( PARTITION q1_1999_jan_feb
             TABLESPACE ts1,
          PARTITION q1_1999_feb_mar
             STORAGE (INITIAL 8M) TABLESPACE ts2) 
   PARALLEL 5;

この操作により、パーティションq1_1999が、q1_1999_jan_febおよびq1_1999_feb_marの2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。個々のパーティションには、パーティション・レベルで指定された新しい物理属性(表領域を含む)があります。これらの新しい属性は、新しいパーティションのデフォルト属性になります。この操作は並列度5で実行されます。

The ALTER TABLE ... SPLIT PARTITION文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name_subpartition nameという書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBPnという書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_Pnという書式のシステム生成のパーティション名が割り当てられます。

次の問合せでは、表quarterly_regional_salesに対する前のパーティション分割操作で生成されたサブパーティション名が表示されます。「コンポジット・レンジ - リスト・パーティション表の作成」で作成されてから、この表に対してこの章でこれまでに実行された他の操作の結果も反映しています。

SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLESPACE_NAME
  FROM DBA_TAB_SUBPARTITIONS
  WHERE TABLE_NAME='QUARTERLY_REGIONAL_SALES'
  ORDER BY PARTITION_NAME;

PARTITION_NAME       SUBPARTITION_NAME              TABLESPACE_NAME
-------------------- ------------------------------ ---------------
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_WEST           TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_NORTHEAST      TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTHEAST      TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_NORTHCENTRAL   TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTHCENTRAL   TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTH          TS2
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_WEST           TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_NORTHEAST      TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTHEAST      TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_NORTHCENTRAL   TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTHCENTRAL   TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTH          TS1
Q1_2000              Q1_2000_NORTHWEST              TS3
Q1_2000              Q1_2000_SOUTHWEST              TS3
Q1_2000              Q1_2000_NORTHEAST              TS3
Q1_2000              Q1_2000_SOUTHEAST              TS3
Q1_2000              Q1_2000_NORTHCENTRAL           TS3
Q1_2000              Q1_2000_SOUTHCENTRAL           TS3
Q2_1999              Q2_1999_NORTHWEST              TS4
Q2_1999              Q2_1999_SOUTHWEST              TS4
Q2_1999              Q2_1999_NORTHEAST              TS4
Q2_1999              Q2_1999_SOUTHEAST              TS4
Q2_1999              Q2_1999_NORTHCENTRAL           TS4
Q2_1999              Q2_1999_SOUTHCENTRAL           TS4
Q3_1999              Q3_1999_NORTHWEST              TS4
Q3_1999              Q3_1999_SOUTHWEST              TS4
Q3_1999              Q3_1999_NORTHEAST              TS4
Q3_1999              Q3_1999_SOUTHEAST              TS4
Q3_1999              Q3_1999_NORTHCENTRAL           TS4
Q3_1999              Q3_1999_SOUTHCENTRAL           TS4
Q4_1999              Q4_1999_NORTHWEST              TS4
Q4_1999              Q4_1999_SOUTHWEST              TS4
Q4_1999              Q4_1999_NORTHEAST              TS4
Q4_1999              Q4_1999_SOUTHEAST              TS4
Q4_1999              Q4_1999_NORTHCENTRAL           TS4
Q4_1999              Q4_1999_SOUTHCENTRAL           TS4

36 rows selected.

* - リスト・サブパーティションの分割

* - リスト・パーティション表のリスト・サブパーティションの分割は、「リスト・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITIONではなくSUBPARTITIONです。たとえば、次の文では、quarterly_regional_sales表のサブパーティションを分割します。

ALTER TABLE quarterly_regional_sales SPLIT SUBPARTITION q2_1999_southwest
   VALUES ('UT') INTO
      ( SUBPARTITION q2_1999_utah
           TABLESPACE ts2,
        SUBPARTITION q2_1999_southwest
           TABLESPACE ts3
      ) 
   PARALLEL;

この操作により、サブパーティションq2_1999_southwestが、次の2つのサブパーティションに分割されます。

  • リテラル値のリストが('UT')q2_1999_utah

  • 残りのリテラル値のリスト('AZ','NM')を継承しているq2_1999_southwest

個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。

時間隔 - リスト・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティション値を変更するには、サブパーティション・テンプレートを変更する必要があります。

* - レンジ・パーティションの分割

* - レンジ・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのレンジ値を指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。

次の例では、時間隔 - レンジ・パーティション表ordersの2007年5月の時間隔パーティションを分割します。

ALTER TABLE orders
    SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy'))
    AT (TO_DATE('15-MAY-2007','dd-MON-yyyy'))
    INTO (PARTITION p_fh_may07,PARTITION p_sh_may2007);

この操作により、時間隔パーティションFOR('01-MAY-2007')が、p_fh_may07およびp_sh_may_2007の2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。「時間隔パーティションのマージ」で説明されているように、2007年6月のパーティションより前の時間隔パーティションはレンジ・パーティションに変換されます。

ALTER TABLE ... SPLIT PARTITION文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name_subpartition nameという書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBPnという書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_Pnという書式のシステム生成のパーティション名が割り当てられます。

次の問合せでは、表ordersに対する前のパーティション分割操作で生成されたサブパーティション名と上限値が表示されます。表が作成されてから、この章でこれまでに実行された他の操作の結果も反映しています。

BREAK ON partition_name

SELECT partition_name, subpartition_name, high_value
FROM user_tab_subpartitions
WHERE table_name = 'ORCERS'
ORDER BY partition_name, subpartition_position;

PARTITION_NAME            SUBPARTITION_NAME              HIGH_VALUE
------------------------- ------------------------------ ---------------
P_BEFORE_2007             P_BEFORE_2007_P_SMALL          1000
                          P_BEFORE_2007_P_MEDIUM         10000
                          P_BEFORE_2007_P_LARGE          100000
                          P_BEFORE_2007_P_EXTRAORDINARY  MAXVALUE
P_FH_MAY07                SYS_SUBP2985                   1000
                          SYS_SUBP2986                   10000
                          SYS_SUBP2987                   100000
                          SYS_SUBP2988                   MAXVALUE
P_PRE_MAY_2007            P_PRE_MAY_2007_P_SMALL         1000
                          P_PRE_MAY_2007_P_MEDIUM        10000
                          P_PRE_MAY_2007_P_LARGE         100000
                          P_PRE_MAY_2007_P_EXTRAORDINARY MAXVALUE
P_SH_MAY2007              SYS_SUBP2989                   1000
                          SYS_SUBP2990                   10000
                          SYS_SUBP2991                   100000
                          SYS_SUBP2992                   MAXVALUE

* - レンジ・サブパーティションの分割

* - レンジ・パーティション表のレンジ・サブパーティションの分割は、「レンジ・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITIONではなくSUBPARTITIONです。たとえば、次の文では、orders表のサブパーティションを分割します。

ALTER TABLE orders
SPLIT SUBPARTITION p_pre_may_2007_p_large AT (50000)
INTO (SUBPARTITION p_pre_may_2007_med_large TABLESPACE TS4
     , SUBPARTITION p_pre_may_2007_large_large TABLESPACE TS5
     );

この操作により、サブパーティションp_pre_may_2007_p_largeが、次の2つのサブパーティションに分割されます。

  • 値が10000から50000のp_pre_may_2007_med_large

  • 値が50000から100000のp_pre_may_2007_large_large

個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。

時間隔 - レンジ・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティションの上限を変更するには、サブパーティション・テンプレートを変更する必要があります。

索引パーティションの分割

ローカル索引のパーティションは明示的に分割できません。ローカル索引パーティションが分割されるのは、基礎となる表のパーティションを分割した場合のみです。ただし、グローバル索引パーティションは、次の例のようにして分割できます。

ALTER INDEX quon1 SPLIT 
    PARTITION canada AT ( 100 ) INTO 
    PARTITION canada1 ..., PARTITION canada2 ...);
ALTER INDEX quon1 REBUILD PARTITION canada1;
ALTER INDEX quon1 REBUILD PARTITION canada2;

分割する索引に索引データが含まれていても問題はなく、元のパーティションがUNUSABLEとマークされていなければ、結果のパーティションを再作成する必要はありません。

SPLIT PARTITIONおよびSPLIT SUBPARTITION操作の最適化

2つの新しいパーティションを作成し、分割されるパーティションの行を2つの新しいパーティションに再分散することで、Oracle DatabaseにSPLIT PARTITION操作が実装されます。この操作には時間がかかります。分割対象のパーティションのすべての行をスキャンしてから、新しいパーティションに1行ずつ挿入する必要があるためです。さらに、UPDATE INDEXES句を使用しない場合、ローカルおよびグローバル索引も再作成する必要があります。

分割操作後、分割されたパーティションのすべての行が新しいパーティションの一方に含まれ、もう一方には行がない場合があります。これは、表の最初のパーティションを分割した場合によく起こります。このような状況はデータベースにより検出され、分割操作が最適化されます。この最適化により、パーティションの追加操作のように動作する分割操作が高速になります。

具体的には、次の条件をすべて満たしている場合に、SPLIT PARTITION操作がデータベースにより最適化および高速化されます。

  • 結果の2つのパーティションの一方が空である必要があります。

  • 空ではない結果のパーティションの記憶域特性が、分割されたパーティションの記憶域特性と同一である必要があります。具体的な内容を次に示します。

    • 分割元のパーティションがコンポジットの場合、空ではない新しい結果のパーティションの各サブパーティションの記憶域特性は、分割元のパーティションのサブパーティションの記憶域特性と同一である必要があります。

    • 分割元のパーティションにLOB列が含まれる場合、空ではない新しい結果のパーティションの各LOB(サブ)パーティションの記憶域特性は、分割元のパーティションのLOB(サブ)パーティションの記憶域特性と同一である必要があります。

    • オーバーフローが含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各オーバーフロー(サブ)パーティションの記憶域特性は、分割元のパーティションのオーバーフロー(サブ)パーティションの記憶域特性と同一である必要があります。

    • マッピング表が含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各マッピング表(サブ)パーティションの記憶域特性は、分割元のパーティションのマッピング表(サブ)パーティションの記憶域特性と同一である必要があります。

分割後にこれらの条件に一致していれば、UPDATE INDEXES句を指定しなかった場合でも、グローバル索引はすべて使用可能なままです。分割前に使用可能であった場合、結果のパーティションの両方に関連付けられているローカル索引(サブ)パーティションは使用可能なままです。空ではない結果のパーティションに対応するローカル索引(サブ)パーティションは、分割されたパーティションのローカル索引(サブ)パーティションと同一になります。SPLIT SUBPARTITION操作にも、同じ最適化が行われます。

パーティションの切捨て

表パーティションからすべての行を削除するには、ALTER TABLE ... TRUNCATE PARTITION文を使用します。パーティションの切捨ては、パーティションのデータはなくなりますが物理的に削除されないことを除き、パーティションの削除に似ています。

索引パーティションは切り捨てられません。ただし、表にローカル索引が定義されている場合には、ALTER TABLE ... TRUNCATE PARTITION文により各ローカル索引の一致するパーティションが切り捨てられます。UPDATE INDEXESを指定しない場合、グローバル索引はUNUSABLEとマークされ、再作成する必要があります。(索引構成表にはUPDATE INDEXESは使用できません。かわりにUPDATE GLOBAL INDEXESを使用してください)。

表パーティションの切捨て

領域を解放するかどうかに関係なく、表パーティションからすべての行を削除するには、ALTER TABLE ... TRUNCATE PARTITION文を使用します。時間隔パーティション表のパーティションを切り捨てても、遷移点は移動されません。参照パーティション表のパーティションおよびサブパーティションは切り捨てられません。

データおよびグローバル索引を含む表パーティションの切捨て

パーティションにデータおよびグローバル索引が含まれている場合は、次のいずれかの方法を使用して表パーティションを切り捨てます。

方法1

ALTER TABLE ... TRUNCATE PARTITION文の実行中は、グローバル索引はそのままにします。この例では、表salesにはグローバル索引sales_area_ixがあり、この索引は再作成されます。

ALTER TABLE sales TRUNCATE PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;

これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。

方法2

ALTER TABLE ... TRUNCATE PARTITION文を発行する前に、DELETE文を実行してパーティションからすべての行を削除します。DELETE文によりグローバル索引が更新され、トリガーの起動や、REDOおよびUNDOログの生成も行われます。

たとえば、最初のパーティションを切り捨てるには、次の文を実行します。

DELETE FROM sales PARTITION (dec98);
ALTER TABLE sales TRUNCATE PARTITION dec98;

これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

方法3

ALTER TABLE文にUPDATE INDEXESを指定します。これにより、パーティションが切り捨てられる時にグローバル索引も切り捨てられます。

ALTER TABLE sales TRUNCATE PARTITION dec98
     UPDATE INDEXES;

データおよび参照整合性制約を含むパーティションの切捨て

パーティションにデータが含まれ、参照整合性制約がある場合には、パーティションを切り捨てられません。削除するパーティションのデータを参照しているデータがない場合は、次のいずれかの方法を選択して表パーティションを切り捨てます。

方法1

整合性制約を無効化し、ALTER TABLE ... TRUNCATE PARTITION文を実行し、整合性制約を再度有効化します。これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。別の表に参照元のデータがある場合には、そのデータを削除して、整合性制約を再度有効化できるようにする必要があります。

方法2

ALTER TABLE ... TRUNCATE PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除します。DELETE文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。参照表のデータが削除されるのは、外部キー制約がON DELETE CASCADEオプション付きで作成されていた場合です。


注意:

すべての行を削除する前にパーティションにNOLOGGING属性を設定すると(ALTER TABLE ... MODIFY PARTITION ... NOLOGGINGを使用)、ログの容量を大幅に減らすことができます。

DELETE FROM sales partition (dec94);
ALTER TABLE sales TRUNCATE PARTITION dec94;

これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

サブパーティションの切捨て

コンポジット・パーティション表のサブパーティションからすべての行を削除するには、ALTER TABLE ... TRUNCATE SUBPARTITION文を使用します。対応するローカル索引サブパーティションも切り捨てられます。

次の文では、表のサブパーティションにあるデータの切捨て方法を示します。この例では、削除済の行で占有された領域を、表領域のその他のスキーマ・オブジェクトで使用できるようになります。

ALTER TABLE diving
   TRUNCATE SUBPARTITION us_locations
      DROP STORAGE;