16 自動SecureFiles縮小

Oracle DatabaseのSecureFiles縮小機能では、SecureFiles LOBセグメント内の未使用領域を解放し、それが含まれている表領域にその領域を再度解放するための、手動方式と自動方式が提供されます。この章では、Oracle Databaseで自動SecureFiles縮小という自動方式を使用する方法について説明します。

16.1 手動SecureFiles縮小について

SecureFiles LOBセグメントを手動で縮小するには、DDL文を使用して、選択したセグメントに対して縮小操作を実行します。ALTER TABLE ... MOVEまたはALTER TABLE ... SHRINK SPACE文を、SecureFiles LOBセグメントの縮小に使用できます。また、縮小するLOBセグメントを決定する前に、セグメント・アドバイザやPL/SQLプロシージャ(たとえば、DBMS_SPACE.SPACE_USAGE)などのツールを使用して、SecureFiles LOB領域の使用量について情報を返すことができます。

手動縮小方法を選択する場合は、次の点が重要です:

  • 手動SecureFiles縮小操作では、操作の一部がオフラインであるオンラインDDLが使用されます。ここでオフラインとは、重要なセクションの縮小アクティビティが終了するまで同時DMLがブロックされることを意味します。DML文は失敗しませんが、ブロックされます。

  • 手動SecureFiles縮小操作では、UNDO保存の種類が無視され、保存が「なし」であるかのように処理されます。ユーザーは、縮小操作を起動した後にLOB保存機能で通常提供される保証を期待できません。ORA-1555 スナップショットが古すぎますのエラー・メッセージが問合せに表示される場合があります。これが問題となる場合は、縮小操作を慎重に行ってください。

リリース21c以降のSecureFile LOBセグメントでは、shrink_clauseを使用できます。shrink_clauseを呼び出すには、次の2つの方法があります。
  1. 次のコマンドは、特定のLOB列およびそのすべてのパーティションを対象とします。

    ALTER TABLE <table_name> MODIFY LOB <lob_column> SHRINK SPACE
  2. 次のコマンドは、特定の表のすべてのLOB列およびそのパーティションに対して縮小操作をカスケードします。

    ALTER TABLE <table_name> SHRINK SPACE CASCADE

16.2 自動SecureFiles縮小について

Oracle Databaseでのクラウド・サービスというコンテキストにおいては、領域を最も使用しているのがLOBである可能性があります。管理者が、各LOBセグメントが縮小されたかどうかの確認に時間を使えない場合があります。Oracle Database用の自動SecureFiles縮小では、縮小するSecureFiles LOBを一連の基準に基づいて自動選択して、バックグラウンドでSecureFiles縮小を実行できるようにするフレームワークを使用できます。

Oracle Databaseで自動SecureFiles縮小を使用した場合、SecureFiles LOBセグメントで保持されていた領域は、現在および将来のユーザー・ワークロードに影響を与えずに徐々に解放されます。すべてのデータ操作言語(DML)文およびデータ定義言語(DDL)文は、自動SecureFiles縮小の進行中も機能し、それらのパフォーマンスへの影響はないか少ししかありません。ただし、自動SecureFiles縮小は、BasicFiles LOBおよびインラインLOBに対しては効果がありません。

クラウドの場合には、デフォルトで自動SecureFiles縮小がオンになります。

16.3 自動SecureFiles縮小の機能

自動SecureFiles縮小には次の機能があります。

自動タスク・インフラストラクチャの使用

自動SecureFiles縮小は、Autotaskインフラストラクチャの上に構築されています。このインフラストラクチャでは、バックグラウンド実行およびリソース管理が提供されます。Autotask++により、システムで決定された間隔で、バインドされたランタイム内で自動的に縮小タスクが実行されます。

事前割当てとの統合

自動SecureFiles縮小は、パフォーマンスに影響を与えることなく、事前割当てとシームレスに統合されます。自動SecureFiles縮小では、最近事前割当てされたLOBセグメントは回避されます。セグメントの事前割当ては、空き領域の需要が高いセグメントについては、バックグラウンドで実行されます。

DDLおよびDMLとの使用

自動SecureFiles縮小では、アイドル・セグメントのみが対象となり、アクティブなLOBセグメントはスキップされます。バックグラウンドでの自動SecureFiles縮小の動作中でも、ユーザー主導のDDL文およびDML文は失敗せず、そのパフォーマンスへの影響は最小限に抑えられます。セグメントのSecureFiles自動縮小がロックされた行に遭遇した場合、ロックされた行はスキップされます。これは、ロックされた行がDMLアクティビティを示しているか、ロックされた行を待機しているとユーザー・トランザクションでデッドロックが発生する可能性があるためです。自動SecureFiles縮小は、ユーザー・トランザクションとのデッドロックを回避するために、常にNOWAITモードで行ロックを取得します。

アイドルLOBセグメントのみが対象

自動SecureFiles縮小では、不要なブロック・アクセスを防ぐために、システム・グローバル領域(SGA)にある使用可能な情報に基づいて、LOBセグメントが絞り込まれます。自動SecureFiles縮小では、アイドルLOBセグメントのみが選択され、アクティブなLOBセグメントがスキップされるため、アクティブなLOBセグメントに関するパフォーマンスへの影響が最小限に抑えられます。

すべてのLOBセグメントをカバー

縮小タスクでは、複数の間隔にわたり、PDB内のすべてのLOBセグメントが処理されます。これには、ユーザーが作成したLOBセグメント、およびJSONやDBFSなどの機能を使用して作成されたLOBセグメントが含まれます。

縮小の反復実行

自動SecureFiles縮小では、選択したLOBセグメント内のすべての空き領域が一度に解放されるわけではありません。そうではなく、縮小タスクでは、縮小コール(反復)ごとに、適度な量の領域が解放されます。トリクルしきい値により、反復ごとに、縮小する領域の量を定義します。時間の経過とともに、アイドルLOBセグメントの空き領域の量が、事前割当て用に指定された最小値に近付きます。

バックグラウンドでの実行

自動SecureFiles縮小に関わるすべてのステップ(縮小するLOBセグメントの選択など)は、バックグラウンドで実行されます。自動SecureFiles縮小を有効化すると、それが、データベース・インスタンスの起動時に有効になります。自動SecureFiles縮小の動作方法に関するディレクティブは不要です。

UNDO保存の尊重

自動SecureFiles縮小では、UNDO保存期間が考慮されます。この機能では、問合せがUNDO保存期間内に失敗することは許容されていません。これは、影響を受けるLOBセグメントが、自動SecureFiles縮小タスクの一部として解放、再配置または再利用されているためです。期限切れでないブロックは、UNDO保存時間の後にのみ解放されます。

16.4 SecureFiles縮小およびUNDO保存

この項では、自動縮小機能で様々な種類のUNDO保存がどのように処理されるかについて説明します。

SecureFile縮小機能の一部として、エクステントの使用済ブロックが再配置され、エクステントが表領域に解放されます。エクステントが表領域に解放されると、再使用して上書きできます。縮小中のエクステントの解放および再利用により、UNDO保存で期待される動作が変わる場合があります。

表16-1 SecureFile縮小およびUNDO保存

UNDO保存の種類 DML問合せなし 同時DML問合せ

UNDO保存なし

ユーザーの観点からは基礎となるデータが変更されていないため、実行時間の長い問合せはORA-1551 スナップショットが古すぎますで失敗しません。

長時間実行される問合せが、自動SecureFiles縮小にって中断される状況は回避可能です。

問合せが処理されているLOBにDML問合せがアクセスすると、ORA-1551 スナップショットが古すぎますで問合せが失敗する可能性があります。

UNDO保存最小(N秒)

ユーザーの観点からは基礎となるデータが変更されていないため、実行時間の長い問合せはORA-1551 スナップショットが古すぎますで失敗しません。

長時間実行される問合せが、自動SecureFiles縮小にって中断される状況は回避可能です。

DMLによってLOBが変更された場合でも、「N秒」より短いDML問合せはORA-1551 スナップショットが古すぎますで失敗しません。「N秒」より長い問合せは失敗する可能性があります。

動作を変更する必要がある場合は、「N秒」を増やす必要があります。

UNDO保存自動(UNDO_RETENTIONを使用)

ユーザーの観点からは基礎となるデータが変更されていないため、実行時間の長い問合せはORA-1551 スナップショットが古すぎますで失敗しません。

長時間実行される問合せが、自動SecureFiles縮小にって中断される状況は回避可能です。

DMLによってLOBが変更された場合でも、「UNDO_RETENTION秒」より短いDML問合せはORA-1551 スナップショットが古すぎますで失敗しません。「UNDO_RETENTION秒」より長い問合せは失敗する可能性があります。

動作を変更する必要がある場合は、「N秒」を増やす必要があります。

UNDO保存最大

ユーザーの観点からは基礎となるデータが変更されていないため、実行時間の長い問合せはORA-1551 スナップショットが古すぎますで失敗しません。

自動SecureFiles縮小操作では、そのようなLOBセグメント全体がスキップされます。

LOBセグメントが増加できる場合は、DMLでLOBが変更されるとしても、問合せはORA-1551 スナップショットが古すぎますで失敗しません。LOBセグメントに領域圧迫がある場合は、DMLによりLOBが変更されると、ORA-1551 スナップショットが古すぎますで問合せが失敗する可能性があります。問合せが必ず成功する「N秒」の期間はありません。つまり、最悪のシナリオに対しては、UNDO保存最小またはUNDO保存自動よりもUNDO保存最大のほうが寛容であるといえます。

16.5 目標と制限

自動SecureFiles縮小は、最適な動作のために一連の目標および制限に従います。

16.5.1 自動SecureFiles縮小の目標

自動SecureFiles縮小の目標により、1回の自動縮小実行で解放する必要がある、領域の量が決まります。

手動縮小では、縮小コマンドによって、空き領域がなくなるまで領域の解放が続行されます。自動SecureFiles縮小では、縮小実行ごとに縮小目標が設定されます。この目標は次の条件に基づいています。

  • 自動SecureFiles縮小タスクで解放可能なセグメント領域の最小限度(これを下回ると解放できない)を示す、事前割当てしきい値。

  • 自動SecureFiles縮小がLOBセグメントの領域を1回の反復で解放できる最大制限を指定するトリクルしきい値。

16.5.1.1 事前割当てしきい値

事前割当てしきい値は、LOBセグメントについて、目標となる最小空き領域を計算するために使用されます。

事前割当てしきい値は、LOBセグメント・サイズに対する空き領域の割合で表されます。たとえば、2 TBのLOBセグメントの場合、空き領域の最小量は20 GB (2 TB * 1%)です。実際の空き領域が事前割当てしきい値より少ない場合は、事前割当てがトリガーされ、セグメントにエクステントが追加されます。デフォルトでは、期限切れでない領域は空き領域とみなされません。

ノート:

自動SecureFiles縮小では、領域は、LOBセグメントの事前割当て最小しきい値より少ない場合は解放されません。

表16-2に、セグメント・サイズごとのデフォルトの事前割当てしきい値を示します。

ノート:

将来のOracle Databaseリリースでは、最適化を使用してそれらのしきい値を調整できます。

表16-2 事前割当てしきい値

セグメント・サイズ 実際のしきい値 最小空き領域

<= 1 GB

10%

100 MB

<= 10 GB

5%

500 MB

<= 100 GB

2%

2 GB

> 100 GB

1%

1 GB

16.5.1.2 自動SecureFiles縮小のトリクルしきい値

トリクルしきい値により、自動縮小の反復1回で解放される、セグメント当たりの最大領域量を制御します。

LOBセグメントで縮小を実行すると、領域が増分的に解放されます。したがって、トリクルしきい値は縮小の増分量であり、同時に実行されているDML文およびDDL文のパフォーマンスに、待機時間の増加による顕著な影響を与えずに、限られた領域を反復処理で縮小タスクが解放できるようにします。

ノート:

自動SecureFiles縮小では、領域は、LOBセグメントの事前割当て最小しきい値より少ない場合は解放されません。

16.5.1.3 縮小目標の例

自動SecureFiles縮小での縮小目標の計算方法の例を次に示します。

実際の縮小トリクルしきい値は、LOBが増分的に再編成される縮小の増分量ですが、次の例では、縮小のトリクルしきい値が128MBと想定されています。

例1: セグメント・サイズ = 1000 MB、使用済領域 = 600 MB、期限切れでない領域 = 0 MB

  • 事前割当てしきい値に基づく中間値: 600 MB / (1 - 10%) = 667 MB

  • 縮小トリクルしきい値に基づく中間値(MB): 1000 MB – 128 MB = 872 MB

  • 最終縮小目標 = 1000 MB - Max(667 MB, 872 MB) = 128 MB

例2: セグメント・サイズ = 1000 MB、使用済領域 = 600 MB、期限切れでない領域 = 300 MB

  • 事前割当てしきい値に基づく中間値: (600 MB + 300 MB) / (1 - 10%) = 1000 MB

  • 縮小トリクルしきい値に基づく中間値(MB): 1000 MB – 128 MB = 872 MB

  • 最終縮小目標 = 1000 MB - Max(1000 MB, 872 MB) = 0 MB

  • 自動SecureFiles縮小ではこのLOBセグメントはスキップされます。

16.5.2 LOBセグメントのアイドル時間制限

LOBセグメントのアイドル時間制限とは、LOBセグメントがアイドル状態になってから縮小を開始できるようになるまでの最短時間限度です。

LOBセグメントのアイドル時間制限により、LOBセグメントが自動SecureFiles縮小の対象となるまでのアイドル状態である必要がある最短時間を指定します。アイドルLOBセグメントは、過去N時間にユーザー主導のDML文も事前割当てアクティビティもないセグメントと定義付けられています。LOBセグメントのアイドル時間制限により、時間数Nを定義します。LOBセグメントのアイドル時間制限のデフォルト値は1440分(24時間)です。

16.6 縮小するLOBセグメントの選択基準

次に、縮小するLOBセグメントを選択するために自動SecureFiles縮小で使用される基準を示します。

自動SecureFiles縮小タスクでは、縮小するLOBセグメントを選択するときに、次のLOBセグメントが除外されます。

  • LOBセグメントのアイドル時間制限によりアイドル・セグメントではないとみなされたLOBセグメント。

  • 余剰の空き領域が事前割当てしきい値より多くないLOBセグメント。

  • RETENTION MAXが設定されているLOBセグメント。これは、そのセグメントで、期限切れでないブロックが、可能なかぎり多く保持されるということです。

  • 現在縮小中のLOBセグメント。

  • 期限切れの空き領域が十分にないLOBセグメント。これのために、自動SecureFiles縮小では、期限切れでない領域が使用済領域として扱われます。

  • 前の縮小タスクが失敗したLOBセグメント。前の縮小コールで、そのLOBセグメントの領域の解放が失敗しています。自動SecureFiles縮小では、以前に縮小できなかったLOBセグメントが特定され、そのようなセグメントが回避されます。

16.7 自動SecureFiles縮小タスク

自動SecureFiles縮小タスクでは、LOBセグメントの縮小を達成するための一連のステップが実行されます。

有効になっている場合、縮小タスクは、AutoTaskで実行されるバックグラウンド・アクションのインスタンスの1つとして実行されます。このタスクは、30分ごとに実行され、次のステップを実行します。

  1. 縮小タスクには、タスク開始時には30分あります。タスクの進行に合わせて、これまで費やした時間と、縮小コールの平均期間が両方追跡されます。後者を使用して、次回の縮小コールにかかる時間が予測されます。もう1回コールするには残り時間が足りない場合、縮小タスクは終了されます。縮小コールは、30分間という目標を超えると終了されます。
  2. 自動SecureFiles縮小では、内部カタログ表から次の1回分のLOBセグメントがフェッチされます(これはobjd順になっています)。前回の縮小タスクでの最後のobjdが、次回の縮小タスクの開始点として使用されます。
  3. 自動SecureFiles縮小により、SecureFiles LOBセグメントの選択基準から基準フィルタが適用されて、縮小タスクの対象外のセグメントが除去されます。
  4. 対象になるセグメントが見つかると、縮小タスクで、そのセグメントに対する作業を開始できるようになります。
  5. 縮小を開始する前に、縮小目標が計算されます。縮小目標は、事前割当てしきい値、および自動SecureFiles縮小のトリクルしきい値に基づいています。
  6. 自動SecureFiles縮小により、縮小コマンドが実行されます。ALTER TABLE ... SHRINK SPACEコマンドは、OCIインタフェースを使用して実行されます。
  7. 自動SecureFiles縮小により、次回の縮小のタイムスタンプフィールドのSGA構造が更新されます。このフィールドでは、自動SecureFiles縮小でこのLOBセグメントを再度選択できる最早時間が示されます。領域が正常に解放された場合、このタイムスタンプには現在時間が使用されます。そうでない場合は、縮小に将来の時間が割り当てられます。縮小に成功しなかった場合は、自動SecureFiles縮小で将来の縮小タスクにおいて同じセグメントが選択されないように、ペナルティ時間が課されます。

16.7.1 縮小タスクの例

次に、自動SecureFiles縮小タスクの例を示します。

0:00に最初の反復

  • 内部カタログ表からLOBセグメントをフェッチし、それが候補である(選択基準を満たしている)かどうかを判断します。

  • SHRINKコマンドが実行されます。縮小のこの反復が10分後に終了します。SGA構造を更新します。

  • もう1つのLOBセグメントを縮小するための時間が十分あると判断されます(縮小2回目のための時間が十分あると仮定)。

  • 縮小2回目が15分後に終了します。自動SecureFiles縮小により、残り時間がないと判断されて、それが終了されます。

0:30に2回目の反復

  • 縮小1回目が20分後に終了します。自動SecureFiles縮小により、縮小もう1回のための残り時間がないと判断されます。

1:00に3回目の反復

  • 候補が見つかるまで、内部カタログ表から次のLOBセグメントのフェッチを続けます。SHRINKコマンドを実行し、SGA構造を更新します。

  • 反復3回目での最初のステップが、残り時間がなくなるまで繰り返されます。

16.8 進行状況の確認

自動SecureFiles縮小の結果を確認する最も簡単な方法は、データベース内のLOBセグメントの合計サイズを計算することです。または、V$SECUREFILE_SHRINK表を使用してマイクロ・レベルで領域節約を確認することもできます。この表では、縮小されたLOBセグメントごとに1行がレポートされます。

関連項目:

V$SECUREFILE_SHRINK: 前の縮小コールの結果を表示します。