4.3 パーティションでサポートされているメンテナンス操作
パーティション、サブパーティションおよび索引パーティションで実行できる、様々なメンテナンス操作があります。
次の表およびトピックで、パーティション、サブパーティションおよび索引パーティションでサポートされているメンテナンス操作について説明します。
-
表4-1に、パーティション表およびコンポジット・パーティション表で実行できるパーティション・メンテナンス操作を示します。
-
表4-2に、コンポジット・パーティション表で実行できるサブパーティション・メンテナンス操作を示します。
-
表4-3に、索引パーティションで実行可能なメンテナンス操作を示し、どのタイプの索引(グローバルまたはローカル)を実行可能かを記載します。
表4-1および表4-2にパーティション化およびサブパーティション化の種類ごとに、メンテナンス操作の実行に使用されるALTER TABLE
文の特定の句が示されます。
ノート:
複数のパーティションのパーティション・メンテナンス操作は、ドメイン索引を使用した表でサポートされていません。
表4-1 表パーティションに対するALTER TABLEメンテナンス操作
メンテナンス操作 | レンジ・コンポジット・レンジ - * | 時間隔コンポジット時間隔 - * | ハッシュ | リスト・コンポジット・リスト - * | 参照 |
---|---|---|---|---|---|
パーティションの追加。「パーティションおよびサブパーティションの追加について」を参照してください |
|
該当なし |
|
|
該当なし。(これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。) |
パーティションの結合。「パーティションおよびサブパーティションの結合について」を参照してください |
該当なし |
該当なし |
|
該当なし |
N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。) |
パーティションの削除。「パーティションおよびサブパーティションの削除について」を参照してください |
|
|
該当なし |
|
N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。) |
パーティションの交換。「パーティションおよびサブパーティションの交換について」を参照してください |
|
|
|
|
|
パーティションのマージ。「パーティションおよびサブパーティションのマージについて」を参照してください |
|
|
該当なし |
|
N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。) |
|
|
|
|
|
|
|
|
|
|
|
|
該当なし |
該当なし |
該当なし |
|
該当なし |
|
該当なし |
該当なし |
該当なし |
|
該当なし |
|
パーティションの移動。「パーティションおよびサブパーティションの移動について」を参照してください |
|
|
|
|
|
パーティション名の変更。「パーティションおよびサブパーティション名の変更について」を参照してください |
|
|
|
|
|
パーティションの分割。「パーティションおよびサブパーティションの分割について」を参照してください |
|
|
該当なし |
|
N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。) |
パーティションの切捨て。「パーティションおよびサブパーティションの切捨てについて」を参照してください |
|
|
|
|
|
表4-2 表サブパーティションに対するALTER TABLEメンテナンス操作
メンテナンス操作 | コンポジット* - レンジ | コンポジット* - ハッシュ | コンポジット* - リスト |
---|---|---|---|
サブパーティションの追加。「パーティションおよびサブパーティションの追加について」を参照してください |
|
|
|
サブパーティションの結合。「パーティションおよびサブパーティションの結合について」を参照してください |
該当なし |
|
該当なし |
サブパーティションの削除。「パーティションおよびサブパーティションの削除について」を参照してください |
|
該当なし |
|
サブパーティションの交換。「パーティションおよびサブパーティションの交換について」を参照してください |
|
該当なし |
|
サブパーティションのマージ。「パーティションおよびサブパーティションのマージについて」を参照してください |
|
該当なし |
|
|
|
|
|
サブパーティションの実際の属性の変更。「パーティションの実際の属性の変更について」を参照してください |
|
|
|
リスト・サブパーティションの変更。「リスト・パーティションの変更について: 値の追加」を参照してください |
該当なし |
該当なし |
|
リスト・サブパーティションの変更。「リスト・パーティションの変更について: 値の削除」を参照してください |
該当なし |
該当なし |
|
|
|
|
|
サブパーティションの移動。「パーティションおよびサブパーティションの移動について」を参照してください |
|
|
|
サブパーティション名の変更。「パーティションおよびサブパーティション名の変更について」を参照してください |
|
|
|
サブパーティションの分割。「パーティションおよびサブパーティションの分割について」を参照してください |
|
該当なし |
|
サブパーティションの切捨て。「パーティションおよびサブパーティションの切捨てについて」を参照してください |
|
|
|
ノート:
ビットマップ索引のあるパーティション表や、現在圧縮されていないパーティションのみを含むパーティション表に、圧縮されたパーティションを組み込むために最初に表圧縮を使用する場合は、次の手順を実行する必要があります。
-
既存のすべてのビットマップ索引およびビットマップ索引パーティションを削除するか、
UNUSABLE
とマークします。 -
表圧縮属性を設定します。
-
索引を再作成します。
これらの処理は、パーティションにデータが含まれているかどうかには関係なく、圧縮されたパーティションを組み込む操作です。
これは、Bツリー索引を含むパーティション表、またはパーティション索引構成表には適用されません。
表4-3に索引パーティションで実行可能なメンテナンス操作を示し、どのタイプの索引(グローバルまたはローカル)で実行可能かを記載します。メンテナンス操作に使用するALTER INDEX
句を表示します。
グローバル索引は、基礎となる表の構造を反映しません。パーティション化されている場合は、レンジまたはハッシュでパーティション化できます。
ローカル索引では基礎となる表の構造が反映されるため、表パーティションおよびサブパーティションがメンテナンス・アクティビティの影響を受けると、パーティション化も自動的にメンテナンスされます。そのため、ローカル索引でのパーティション・メンテナンスの必要性は低く、オプションの数も少なくなっています。
表4-3 索引パーティションに対するALTER INDEXメンテナンス操作
メンテナンス操作 | 索引のタイプ | 索引パーティション化のタイプ | ||
---|---|---|---|---|
レンジ | ハッシュおよびリスト | コンポジット | ||
グローバル |
|
|
- |
|
ローカル |
該当なし |
該当なし |
該当なし |
|
グローバル |
|
- |
- |
|
ローカル |
該当なし |
該当なし |
該当なし |
|
グローバル |
|
- |
- |
|
ローカル |
|
|
|
|
グローバル |
|
- |
- |
|
ローカル |
|
|
|
|
グローバル |
|
- |
- |
|
ローカル |
|
|
|
|
グローバル |
|
- |
- |
|
ローカル |
|
|
|
|
グローバル |
|
- |
- |
|
ローカル |
該当なし |
該当なし |
該当なし |
4.3.1 索引の自動更新
パーティション表および索引に対する個々のメンテナンス操作を説明する前に、ALTER
TABLE
文に指定可能なUPDATE
INDEXES
句の影響を説明します。
デフォルトでは、パーティション表に対する表メンテナンス操作の多くにより、対応する索引または索引パーティションが無効化(UNUSABLE
とマーク)されます。索引全体または各パーティション(グローバル索引の場合)を再作成する必要があります。メンテナンス操作で、ALTER
TABLE
文にUPDATE
INDEXES
を指定すると、データベースによりこのデフォルトの動作が上書きされます。この句を指定すると、メンテナンス操作のDDL文の実行時に、データベースにより索引が更新されます。これには、次の利点があります。
-
索引が、ベース表操作とともに更新されます。後で更新して、個別に索引を再作成する必要はありません。
-
グローバル索引は
UNUSABLE
とマークされないため、高い可用性を備えています。パーティションDDLの実行中でもこれらの索引は使用可能なままで、表内の影響を受けないパーティションにアクセスできます。 -
すべての無効な索引を再作成するために、名前を調べる必要はありません。
ローカル索引のオプションの句で、更新されたローカル索引やそのパーティションに物理特性および記憶域特性を指定できます。
-
各ローカル索引のそれぞれのパーティションに物理属性、表領域記憶域およびロギングを指定できます。または、
PARTITION
キーワードのみを指定して、次のようにデータベースによるパーティション属性の更新を行うことも可能です。-
単一の表パーティションに対する操作(
MOVE
PARTITION
やSPLIT
PARTITION
など)では、対応する索引パーティションは影響を受ける表パーティションの属性を継承します。データベースでは新しい索引パーティションの名前は生成されないため、この操作により作成される新しい索引パーティションは、対応する新しい表パーティションから名前を継承します。 -
MERGE
PARTITION
操作の場合、この操作によって作成されたローカル索引パーティションは、作成された表パーティションの名前とローカル索引の属性を継承します。
-
-
コンポジット・パーティション索引では、各サブパーティションに表領域記憶域を指定できます。
次の操作では、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%に満たない場合は、経験則から言って、索引を更新する方が短時間ですみます。 -
EXCHANGE
操作が高速な操作ではなくなりました。こちらも、DDLを実行してすべての索引を再作成する場合にかかる時間と比較する必要があります。 -
グローバル索引を含む表を更新する際の考慮事項は、次のとおりです。
-
索引はその場で更新されます。索引の更新は記録され、REDOおよびUNDOレコードが生成されます。反対に、グローバル索引全体を再作成する場合は、
NOLOGGING
モードで実行できます。 -
索引全体を手動で再作成すると、領域がより有効に使用されて圧縮されるため、より効率的な索引が作成されます。
-
-
UPDATE INDEXES
句は、索引構成表ではサポートされていません。ただし、DROP
PARTITION
、TRUNCATE
PARTITION
およびEXCHANGE
PARTITION
操作でUPDATE GLOBAL INDEXES
句を使用して、索引構成表のグローバル索引を使用可能なままにできます。前述のリストのその他の操作では、索引構成表のグローバル索引は使用可能なままになります。また、索引構成表のローカル索引パーティションは、MOVE
PARTITION
操作後も使用可能なままです。
関連項目:
索引の更新の構文のALTER TABLE
のupdate_all_indexes_clause
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.3.2 パーティションを削除および切り捨てる非同期グローバル索引メンテナンス
パーティション・メンテナンス操作DROP
PARTITION
およびTRUNCATE
PARTITION
は、メタデータのみの索引メンテナンスを実行して最適化されます。
DROP
およびTRUNCATE
の非同期グローバル索引メンテナンスはデフォルトで実行されますが、UPDATE
INDEXES
句が下位互換性のために引き続き必要です。
次のリストは、非同期グローバル索引メンテナンスの制限事項をまとめています。
-
ヒープ表にのみ実行されます
-
オブジェクト型を含む表はサポートされません
-
ドメイン索引を含む表はサポートされません
-
ユーザーSYSには実行されません
索引のメンテナンス操作は、自動スケジューラ・ジョブSYS.PMO_DEFERRED_GIDX_MAINT_JOB
を使用して実行し、すべてのグローバル索引をクリーンアップできます。デフォルトでは、このジョブは定期的に実行するようスケジュールされます。索引を事前にクリーンアップする場合、DBMS_SCHEDULER.RUN_JOB
を使用していつでもこのジョブを実行できます。ジョブを変更して、特定の要件に基づくスケジュールで実行することもできます。ジョブを削除しないことをお薦めします。
次のオプションのいずれかを使用して、メンテナンスを必要とする索引のクリーンアップを強制することもできます。
-
DBMS_PART.CLEANUP_GIDX
- このPL/SQLプロシージャは、クリーンアップを必要とする可能性があるシステムのグローバル索引のリストを収集し、索引をクリーンな状態にリストアするために必要な操作を実行します。 -
ALTER
INDEX
REBUILD
[PARTITION
] – このSQL文は、Oracle Database 12cリリース1 (12.1)より前のリリースで実行されるように、索引全体または索引パーティションを再作成します。結果の索引(パーティション)は、古いエントリを含みません。 -
ALTER
INDEX
[PARTITION
]COALESCE
CLEANUP
- このSQL文は、索引ブロックの親がないエントリをクリーンアップします。
関連項目:
Oracle Schedulerによるジョブの管理の詳細は、『Oracle Database管理者ガイド』を参照してください
4.3.3 サブパーティション・テンプレートの変更
新しいサブパーティション・テンプレートと置き換えることで、コンポジット・パーティション表のサブパーティション・テンプレートを変更できます。
サブパーティション・テンプレートを使用する後続の操作(ADD
PARTITION
またはMERGE
PARTITIONS
など)で、新しいサブパーティション・テンプレートが使用されます。既存のサブパーティションは変更されません。
時間隔 - *コンポジット・パーティション表のサブパーティション・テンプレートを変更すると、作成されていない時間隔パーティションに新しいサブパーティション・テンプレートが使用されます。
新しいサブパーティション・テンプレートを指定するには、ALTER
TABLE
SET
SUBPARTITION
TEMPLATE
文を使用します。例:
ALTER TABLE employees_sub_template SET SUBPARTITION TEMPLATE (SUBPARTITION e TABLESPACE ts1, SUBPARTITION f TABLESPACE ts2, SUBPARTITION g TABLESPACE ts3, SUBPARTITION h TABLESPACE ts4 );
空のリストを指定することで、サブパーティション・テンプレートを削除できます。
ALTER TABLE employees_sub_template SET SUBPARTITION TEMPLATE ( );
4.3.4 メンテナンス操作のフィルタ処理
パーティション・メンテナンス操作は、データのフィルタ処理の追加をサポートするため、パーティションとデータ・メンテナンスを組み合せることができます。
フィルタ処理されたパーティション・メンテナンス操作は、パーティション・メンテナンスの一部としてデータのフィルタ処理を満たすデータのみを保持します。データのフィルタ処理の機能は、MOVE
PARTITION
、MERGE
PARTITION
およびSPLIT
PARTITION
に適用されます。
例4-27に、ALTER TABLE
文を使用してオープンでない注文(クローズ済注文)をすべて削除すると同時にパーティションを移動する方法を示します。
パーティション表にはフィルタ処理述語が必要です。また、オンラインで実行できるすべてのパーティション・メンテナンス操作(MOVE
およびSPLIT
)は、フィルタ処理されたパーティション・メンテナンス操作として実行することもできます。ONLINE
を指定すると、メンテナンス対象のパーティションに対するDML操作が許可されます。
オンライン・モードで実行されるフィルタ処理されたパーティション・メンテナンス操作は、同時進行中のDML操作にフィルタ述語を使用しません。フィルタ条件は、パーティション・メンテナンス操作の最初に一度だけ適用されます。そのため、後続のDMLは成功しますが、フィルタ処理の観点からは無視されます。どのようなDML操作であっても、パーティション・メンテナンスの開始時にフィルタ条件に一致しないレコードは保持されません。新しく挿入されたレコードは、パーティション・メンテナンス操作のフィルタ条件を満たすかどうかに関係なく、パーティション・キー基準に一致すると挿入されます。フィルタ条件はパーティション表自体に制限され、結合や副問合せ式など、他の表への参照は許可されません。
キーワードONLINE
が例4-27のSQL文で指定されている、次のシナリオを考えてみます。
-
パーティション・メンテナンス操作の開始後に
status='open'
に更新されるパーティションq1_2016
の既存の注文レコードが、このパーティションに保持されていません。 -
パーティション・メンテナンス操作の開始後およびパーティション・メンテナンス操作の進行中に、
status='closed'
の新しい注文レコードをパーティションq1_2016
に挿入できます。
例4-27 メンテナンス操作実行時のフィルタ処理句の使用
ALTER TABLE orders_move_part MOVE PARTITION q1_2016 TABLESPACE open_orders COMPRESS ONLINE INCLUDING ROWS WHERE order_state = 'open';
関連項目:
パーティション表や索引を作成および変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。