19 スキーマ・オブジェクトの領域の管理

スキーマ・オブジェクトの領域の管理には、表領域のアラートと領域の割当て、未使用の領域の再利用、未使用のオブジェクト記憶領域の削除、領域使用量の監視および容量計画などのタスクが含まれます。

19.1 表領域のアラートの管理

Oracle Databaseでは、使用可能な領域が少なくなると事前にアラートで通知されるため、表領域のディスク領域を管理するのに役立ちます。

19.1.1 表領域のアラートの管理について

デフォルトで、警告およびクリティカルの2つのアラートしきい値が定義されています。警告のしきい値は、領域が残り少なくなり始める境界値です。クリティカルのしきい値は、即時に注意を喚起する必要のある深刻な境界値です。データベースは、両方のしきい値でアラートを発行します。

ローカル管理表領域とディクショナリ管理表領域の両方に対してアラートしきい値を指定するには、次の2つの方法があります。

  • パーセント・フルによる方法

    警告のしきい値とクリティカルのしきい値の両方について、使用済領域が合計領域の一定割合以上になるとアラートが発行されます。

  • 空き領域(KB単位)による方法

    警告のしきい値とクリティカルのしきい値の両方について、空き領域が一定容量(KB)未満になるとアラートが発行されます。空き領域のしきい値は、表領域が大規模な場合に便利です。

ローカル管理表領域のアラートはサーバーで生成されます。ディクショナリ管理表領域の場合は、Oracle Enterprise Manager Cloud Control (Cloud Control)がこの機能を提供します。詳細は、「サーバー生成アラートを使用したデータベースの監視」を参照してください。

新しい表領域には、次のようにアラートしきい値が割り当てられます。

  • ローカル管理表領域: ローカル管理表領域を新規作成すると、データベースに定義されているデフォルトのしきい値がその表領域に割り当てられます。新しく作成されたデータベースには、警告のしきい値に85%使用済、クリティカルのしきい値に97%使用済のデフォルトが割り当てられます。新しいデータベースに対する空き領域のしきい値のデフォルトは、両方ともゼロ(無効)です。これらのデータベースのデフォルトは変更可能で、その手順については後で説明します。

  • ディクショナリ管理表領域: ディクショナリ管理表領域を新規作成すると、Cloud Controlのメトリック・カテゴリ「表領域の空き領域(MB)(ディクショナリ管理)」および「表領域使用率(%)(ディクショナリ管理)」の「その他すべて」にリストされているしきい値が割り当てられます。これらの値は、「メトリックとポリシー設定」ページで変更できます。

ノート:

Oracle 9i以前からOracle Database 10g以降にアップグレードするデータベースでは、すべてのローカル管理表領域のアラートしきい値のデータベースのデフォルトは、0(ゼロ)に設定されます。この設定は、アラート・メカニズムを事実上使用禁止にして、新しく移行されたデータベースへの過剰なアラートを回避しています。

19.1.2 アラートしきい値の設定

各表領域には、パーセント・フルのしきい値のみ、空き領域のしきい値のみ、または同時に両方のしきい値タイプを設定できます。どちらのタイプのしきい値も、0(ゼロ)に設定すると無効になります。

理想的な警告のしきい値は、クリティカルのしきい値が発行される前に問題を解決できる時間を考慮して、早めにアラートを発行する設定です。クリティカルのしきい値は、ただちに処理してサービスの損失を回避できるよう十分早めにアラートを発行するように設定します。

ローカル管理表領域のアラートしきい値を設定するには:

  • 次のいずれかの操作を行います。

    • Cloud Controlの「表領域」ページを使用します。

      表領域の領域使用量アラートしきい値の変更の詳細は、Cloud Controlのオンライン・ヘルプを参照してください。

    • DBMS_SERVER_ALERT.SET_THRESHOLDパッケージ・プロシージャをコールします。

      詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

ディクショナリ管理表領域のアラートしきい値を設定するには:

  • Cloud Controlの「表領域」ページを使用します。

    表領域の領域使用量アラートしきい値の変更の詳細は、Cloud Controlのオンライン・ヘルプを参照してください。

例 - Cloud Controlを使用したアラートしきい値の設定

表領域に対する領域使用率がしきい値に達した場合、Cloud Controlはアラートを受け取ります。領域使用率のアラートは2種類あり、「警告」は、表領域の使用量が低い場合に、「クリティカル」は、表領域がほぼ一杯でアクションがすぐに必要な場合に発行されます。

警告アラートとクリティカル・アラートの両方に、次の方法でアラートしきい値を指定できます。

  • 使用領域ごと(%)

    使用されている領域が全領域の一定の割合以上になった場合、アラートが発行されます。

  • 空き領域ごと(MB)

    空き領域がMB単位を下回る場合、アラートが発行されます。

    空き領域のしきい値は、表領域が大きい場合ほど有用です。たとえば、10TBの表領域で限界のアラートの割合を全体の99%に設定すると、100GBの空き領域が切った場合データベースによってアラートが発行されることになります。通常、空き領域が100GBになったということは重大な状態ではないため、アラートは有効とはいえません。この表領域の場合、空き領域が5GBを切った場合に限界のアラートを発行するような設定の方が、空き領域のしきい値が有効に使用されています。

表領域に対する警告および限界のアラートの両方に関して、使用されている領域のしきい値または空き領域のしきい値のいずれか、または両方を有効にできます。

表領域の領域使用量アラートしきい値を変更するには:

  1. データベース・ホームページに移動します。

  2. 「管理」メニューから、「記憶域」を選択し、「表領域」を選択します。

    「表領域」ページが表示されます。

  3. 変更するしきい値を持つ表領域を選択し、「編集」をクリックします。

    表領域の編集ページ、および一般サブページが表示されます。

  4. ページ上部の「しきい値」タブをクリックし、しきい値サブページを表示します。

  5. 「使用済領域(%)」セクションで、次のいずれかを実行します。

    • デフォルトしきい値を許可します。

    • 「しきい値の指定」を選択し、「警告(%)」のしきい値および「クリティカル(%)」のしきい値を入力します。

    • 「しきい値の無効化」を選択し、すべてのしきい値を無効にします。

  6. 「空き領域(MB)」セクションで、次のいずれかを行います。

    • デフォルトしきい値を許可します。

    • 「しきい値の指定」を選択し、「警告(MB)」のしきい値および「クリティカル(MB)」のしきい値を入力します。

    • 「しきい値の無効化」を選択し、残りの空き領域のしきい値を無効にします。

  7. 「適用」をクリックします。

    確認メッセージが表示されます。

例 - パッケージ・プロシージャを使用したアラートしきい値の設定

次の例は、USERS表領域について空き領域のしきい値を10MB(警告)および2MB(クリティカル)に設定し、パーセント・フルのしきい値を無効にします。USERS表領域はローカル管理の表領域です。

BEGIN
DBMS_SERVER_ALERT.SET_THRESHOLD(
   metrics_id              => DBMS_SERVER_ALERT.TABLESPACE_BYT_FREE,
   warning_operator        => DBMS_SERVER_ALERT.OPERATOR_LE,
   warning_value           => '10240',
   critical_operator       => DBMS_SERVER_ALERT.OPERATOR_LE,
   critical_value          => '2048',
   observation_period      => 1,
   consecutive_occurrences => 1,
   instance_name           => NULL,
   object_type             => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
   object_name             => 'USERS');

DBMS_SERVER_ALERT.SET_THRESHOLD(
   metrics_id              => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
   warning_operator        => DBMS_SERVER_ALERT.OPERATOR_GT,
   warning_value           => '0',
   critical_operator       => DBMS_SERVER_ALERT.OPERATOR_GT,
   critical_value          => '0',
   observation_period      => 1,
   consecutive_occurrences => 1,
   instance_name           => NULL,
   object_type             => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
   object_name             => 'USERS');
END;
/

ノート:

パーセント・フルのしきい値に0(ゼロ)以外の値を設定する場合は、「以上」演算子OPERATOR_GEを使用します。

データベースのデフォルトしきい値への表領域のリストア

ローカル管理表領域のアラートしきい値に明示的に値を設定した後は、その値をDBMS_SERVER_ALERT.SET_THRESHOLDを使用してNULLに設定することで、データベースのデフォルト値に戻すことができます。

データベースのデフォルトしきい値の変更

ローカルに管理されている表領域のデータベースのデフォルトしきい値を変更するには、前の例に示されているようにDBMS_SERVER_ALERT.SET_THRESHOLDを起動しますが、object_nameNULLに設定します。データベースのデフォルトを使用するすべての表領域で、新しいデフォルトに切り替わります。

19.1.3 アラートの表示

アラートを表示するには、Cloud Controlのデータベース・ホームページにアクセスし、「インシデントと問題」セクションを表示します。

ローカル管理表領域のアラートは、DBA_OUTSTANDING_ALERTSビューを使用して表示することもできます。詳細は、「サーバー生成アラートのデータ・ディクショナリ・ビュー」を参照してください。

19.1.4 制限事項

しきい値ベースのアラートには、いくつかの制限があります。

これらの制限には、次のものが含まれます。

  • アラートは、オフラインまたは読取り専用モードのローカル管理表領域については発行されません。ただし、それらの表領域が読取り/書込みモードまたは使用可能になると、そのアラート・システムは再アクティブ化されます。

  • 表領域をオフライン化または読取り専用モードにする場合は、しきい値を0(ゼロ)に設定して、表領域に対するアラートを使用禁止にする必要があります。後で表領域を再度オンライン化または読取り/書込みモードにする場合は、しきい値を再設定してアラートを再び使用可能にできます。

関連項目:

19.2 再開可能領域割当ての管理

大規模なデータベース処理を一時停止して後で再開できます。

19.2.1 再開可能領域割当ての概要

Oracle Databaseでは、領域割当てが失敗した場合に大規模なデータベース処理を一時停止して、後で再開するための方法が提供されています。そのため、Oracle Databaseサーバーがユーザーにエラーを返すかわりに対処措置を講じることができます。エラー条件が訂正されると、一時停止していた処理が自動的に再開します。この機能のことを、再開可能領域割当てと呼びます。また、影響を受ける文のことを、再開可能文と呼びます。

19.2.1.1 再開可能領域割当ての動作

次に、再開可能領域割当ての動作の概要を示します。

  1. 文が再開可能モードで実行されるのは、その文のセッションが、次のいずれかの処理によって再開可能領域割当てに対応している場合のみです。

    • RESUMABLE_TIMEOUT初期化パラメータが0 (ゼロ)以外の値に設定されている場合に、ALTER SESSION ENABLE RESUMABLE文が実行前にセッション内で発行された。

    • ALTER SESSION ENABLE RESUMABLE TIMEOUT timeout_value文が実行前にセッション内で発行され、timeout_valueが0 (ゼロ)以外の値である。

  2. 次のいずれかの条件が成立すると、再開可能文が一時停止します(非再開可能文では、これらの条件に対応するエラーが通知されます)。

    • 領域不足条件

    • 最大エクステント数到達条件

    • スペース割当制限超過条件。

  3. 再開可能文の実行が一時停止すると、ユーザー指定の操作の実行、エラーの記録および文の実行状態の問合せを行うメカニズムがただちに動作します。再開可能文が一時停止すると、次の処理が実行されます。

    • エラーがアラート・ログに記録されます。

    • 一時停止された再開可能セッションのアラートが発行されます。

    • ユーザーがAFTER SUSPENDシステム・イベントに対してトリガーを登録していた場合は、そのユーザー・トリガーが実行されます。ユーザー指定のPL/SQLプロシージャは、DBMS_RESUMABLEパッケージとDBA_RESUMABLEまたはUSER_RESUMABLEビューを使用して、エラー・メッセージ・データにアクセスできます。

  4. 文が中断されると、自動的にトランザクションも中断されます。その結果、すべてのトランザクション・リソースが文の一時停止から再開までの間保持されます。

  5. ユーザーの介入や他の問合せによってソート領域が解放されるなどの結果としてエラー条件が解決されると、一時停止していた文が自動的に実行を再開し、一時停止された再開可能セッションのアラートがクリアされます。

  6. 一時停止した文は、DBMS_RESUMABLE.ABORT()プロシージャを使用して、強制的に例外を発生できます。このプロシージャは、DBAまたは文を発行したユーザーがコールできます。

  7. RESUMABLE_TIMEOUT初期化パラメータまたはALTER SESSION ENABLE RESUMABLE TIMEOUT文で指定された一時停止のタイムアウト間隔は、再開可能文に対応付けられています。タイムアウト間隔内にエラー条件が解決されない場合は、タイムアウト間隔の間一時停止していた再開可能文がリストアされ、ユーザーに例外が返されます。

  8. 再開可能文は、実行中に一時停止と再開を複数回繰り返すことができます。

19.2.1.2 再開可能な操作

一部の操作は再開可能です。

再開可能な操作は、次のとおりです。

  • 問合せ

    一時領域(ソート領域)を使い果たしたSELECT文は、再開可能な実行の候補になります。OCIの使用時は、OCIStmtExecute()およびOCIStmtFetch()の各コールが候補になります。

  • DML

    INSERT文、UPDATE文およびDELETE文が候補になります。それらを実行するために使用するインタフェースは何でもかまいません。OCI、PL/SQLまたは別のインタフェースを使用できます。また、外部表からのINSERT INTO...SELECTも再開可能にできます。

  • インポート/エクスポート

    SQL*Loaderについては、リカバリ可能なエラーの後に文が再開可能かどうかをコマンドライン・パラメータで制御します。

  • DDL

    次の文が、再開可能な実行の候補になります。

    • CREATE TABLE ... AS SELECT

    • CREATE INDEX

    • ALTER INDEX ... REBUILD

    • ALTER TABLE ... MOVE PARTITION

    • ALTER TABLE ... SPLIT PARTITION

    • ALTER INDEX ... REBUILD PARTITION

    • ALTER INDEX ... SPLIT PARTITION

    • CREATE MATERIALIZED VIEW

    • CREATE MATERIALIZED VIEW LOG

19.2.1.3 訂正可能なエラー

一部のエラーは訂正可能です。

訂正可能なエラーには、次の3つのクラスがあります。

  • 領域不足条件

    データベースの操作によって、表領域内の表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション用のエクステントをこれ以上取得できません。たとえば、次のエラーはこのカテゴリに属します。

    ORA-01653 unable to extend table ... in tablespace ...
    ORA-01654 unable to extend index ... in tablespace ...
    
  • 最大エクステント数到達条件

    表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション内のエクステント数が、オブジェクトで定義されている最大エクステント数に等しくなりました。たとえば、次のエラーはこのカテゴリに属します。

    ORA-01631 max # extents ... reached in table ...
    ORA-01632 max # extents ... reached in index ...
    
  • スペース割当制限超過条件

    ユーザーが自分に割り当てられている表領域内のスペース割当制限を超過しました。具体的には、次のエラーによって示されます。

    ORA-01536 space quote exceeded for tablespace string 
19.2.1.4 再開可能領域割当てと分散処理

分散環境で、ユーザーが再開可能領域割当てを有効または無効にした場合、またはDBAがRESUMABLE_TIMEOUT初期化パラメータを変更した場合、その影響を受けるのはローカルのインスタンスです。RESUMABLEはリモートで有効にできません。

分散トランザクションで、リモート・インスタンスのセッションが一時停止されるのは、リモート・インスタンスがそのサイトでインスタンスまたはセッションに対してRESUMABLEをすでに有効にしている場合のみです。

19.2.1.5 パラレル実行と再開可能領域割当て

パラレル実行では、パラレル実行サーバー・プロセスの1つで訂正可能なエラーが発生した場合、そのサーバー・プロセスの実行が一時停止します。

他のパラレル実行サーバー・プロセスでは、エラーが発生するまで、または一時停止したサーバー・プロセスに(直接または間接に)ブロックされるまで、個々のタスクの実行が継続されます。訂正可能なエラーが解決すると、一時停止したプロセスが実行を再開し、パラレル操作の実行は継続されます。一時停止したプロセスが終了した場合、パラレル操作は中断し、ユーザーに対してエラーが返されます。

異なるパラレル実行プロセスで、1つ以上の訂正可能なエラーが発生することがあります。この結果、AFTER SUSPENDトリガーが複数回、パラレルに発行される場合があります。また、あるパラレル実行サーバー・プロセスが一時停止中に他のパラレル実行サーバー・プロセスで訂正不可能なエラーが発生すると、一時停止していた文はただちに強制終了します。

パラレル実行については、すべてのパラレル実行コーディネータとサーバー・プロセスがDBA_RESUMABLEまたはUSER_RESUMABLEビューに独自のエントリを持っています。

19.2.2 再開可能領域割当ての有効化および無効化

SQL文を実行して特定の初期化パラメータを設定し、再開可能領域割当てを有効または無効にできます。

19.2.2.1 再開可能領域割当ての有効化および無効化について

再開可能領域割当ては、再開可能モードを有効にしたセッションの中で文を実行するときのみ可能です。

再開可能領域割当てがセッションで有効になるのは、ALTER SESSION ENABLE RESUMABLE文が実行され、そのセッションのRESUMABLE_TIMEOUT初期化パラメータが0 (ゼロ)以外の値に設定されている場合です。RESUMABLE_TIMEOUT初期化パラメータをシステム・レベルで設定すると、その設定は、タイムアウト値が指定されていないALTER SESSION ENABLE RESUMABLE文のデフォルトになります。ALTER SESSION ENABLE RESUMABLE文でタイムアウト値を指定すると、システム・デフォルトがオーバーライドされます。

ALTER SESSION ENABLE RESUMABLE文を実行しても、次の場合はセッションで再開可能領域割当てが無効になります。:

  • セッションでALTER SESSION ENABLE RESUMABLE文が実行されない場合。

  • セッションでALTER SESSION DISABLE RESUMABLE文が実行された場合。

  • セッションでALTER SESSION ENABLE RESUMABLE文が実行され、タイムアウト値が0 (ゼロ)の場合。

ノート:

一時停止した文はなんらかのシステム・リソースを保持している可能性があるため、ユーザーが再開可能領域割当てを有効にして、再開可能文を実行するには、RESUMABLEシステム権限が付与されている必要があります。

19.2.2.2 RESUMABLE_TIMEOUT初期化パラメータの設定

RESUMABLE_TIMEOUT初期化パラメータを設定して、デフォルトのシステム全体のタイムアウト間隔を指定できます。

たとえば、初期化パラメータ・ファイルでRESUMABLE_TIMEOUTパラメータを次のように設定すると、タイムアウト間隔は1時間に設定されます。

RESUMABLE_TIMEOUT  = 3600

このパラメータが0 (ゼロ)に設定された場合、タイムアウト値を指定しないでALTER SESSION ENABLE RESUMABLE文を実行するセッションでも、再開可能領域割当ては無効になります。

ALTER SYSTEM SET文を使用して、このパラメータの値をシステム・レベルで変更することもできます。たとえば、次の文では、タイムアウト値を指定しないでALTER SESSION ENABLE RESUMABLE文を実行するすべてのセッションに対して再開可能領域割当てを無効にします。

ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;
19.2.2.3 ALTER SESSIONを使用した再開可能領域割当ての有効化と無効化

セッション内で、ユーザーはALTER SESSION SET文を発行してRESUMABLE_TIMEOUT初期化パラメータを設定し、再開可能領域割当てを有効にしてタイムアウト値を変更するか、または再開可能モードを無効にできます。

次のSQL文を使用して、デフォルトのシステムRESUMABLE_TIMEOUT値でセッションの再開可能モードを有効化できます。

ALTER SESSION ENABLE RESUMABLE;

再開可能モードを無効化するには、次の文を使用します。

ALTER SESSION DISABLE RESUMABLE;

新しいセッションのデフォルトの再開可能モードは無効です。

タイムアウト間隔や、再開可能文の識別に使用する名前も指定できます。次の項では、各操作について説明します。

19.2.2.3.1 タイムアウト間隔の指定

介入操作が発生しなかった場合に一時停止した文がエラーになるタイムアウト間隔は、再開可能モードを有効化するときに指定できます。

次の文は、再開可能トランザクションが3600秒後にタイムアウトし、エラーになることを指定します。

ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;

TIMEOUTの値は、別のALTER SESSION ENABLE RESUMABLE文や他の手段によって変更されるまで、またはセッションが終了するまで有効です。RESUMABLE_TIMEOUT初期化パラメータが設定されていない場合、ENABLE RESUMABLE TIMEOUT句を使用して再開可能モードを有効にするときのデフォルトのタイムアウト間隔は7200秒になります。

関連項目:

再開可能領域割当てのタイムアウト間隔を変更するその他の方法の詳細は、「RESUMABLE_TIMEOUT初期化パラメータの設定」を参照してください

19.2.2.3.2 再開可能文の命名

再開可能文は、名前で識別するように設定できます。

次の文は、再開可能文に名前を割り当てます。

ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600 NAME 'insert into table';

NAMEの値は、別のALTER SESSION ENABLE RESUMABLE文によって変更されるまで、またはセッションが終了するまで有効です。NAMEのデフォルト値は、'User username(userid), Session sessionid, Instance instanceid'です。

文の名前は、DBA_RESUMABLEビューおよびUSER_RESUMABLEビューで再開可能文を識別する際に使用します。

19.2.3 LOGONトリガーを使用したデフォルト再開可能モードの設定

RESUMABLE_TIMEOUT初期化パラメータを設定する以外に、デフォルトの再開可能モードを設定するもう1つの方法は、データベース・レベルのLOGONトリガーを登録して、再開可能を有効化してタイムアウト間隔を設定するように、ユーザーのセッションを変更する方法です。

ノート:

再開可能文のデフォルトのモードとタイムアウトを変更する登録済トリガーが複数ある場合、その結果は予測できません。これは、トリガーの起動順序がOracle Databaseで保証されていないためです。

19.2.4 一時停止文の検出

再開可能文が一時停止するとき、クライアントにはエラーは通知されません。訂正処理を実行するため、Oracle Databaseではユーザーにエラーを通知して状況に関する情報を提供するかわりの手段が提供されています。

19.2.4.1 ユーザーへの通知: AFTER SUSPENDシステム・イベントおよびトリガー

再開可能文で訂正可能なエラーが発生すると、システムは内部的にAFTER SUSPENDシステム・イベントを生成します。ユーザーは、このイベントに対するトリガーをデータベース・レベルとスキーマ・レベルの両方で登録できます。ユーザーがこのシステム・イベントを処理するトリガーを登録した場合、トリガーはSQL文が一時停止した後に実行されます。

AFTER SUSPENDトリガー内部で実行されたSQL文は、再開不可能であり、かつ自律型です。トリガー内部で開始されたトランザクションは、SYSTEMロールバック・セグメントを使用します。これらの条件が課されるのは、デッドロックを回避し、文と同じエラー条件に直面する可能性を少なくするためです。

ユーザーはUSER_RESUMABLEビュー、DBA_RESUMABLEビューまたはDBMS_RESUMABLE.SPACE_ERROR_INFOファンクションをトリガー内部で使用して、再開可能文に関する情報を取得できます。

また、トリガーではDBMS_RESUMABLEパッケージをコールして、一時停止した文の終了や再開可能タイムアウト値の変更を実行できます。次の例では、DBMS_RESUMABLEをコールしてタイムアウトを3時間に設定する、システム全体で有効なAFTER SUSPENDトリガーを作成することによって、デフォルトのシステム・タイムアウトを変更します。

CREATE OR REPLACE TRIGGER resumable_default_timeout
AFTER SUSPEND
ON DATABASE
BEGIN
   DBMS_RESUMABLE.SET_TIMEOUT(10800);
END;
/

関連項目:

トリガーとシステム・イベントの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

19.2.4.2 ビューを使用した一時停止文情報の取得

ビューのセットに対する問合せにより、再開可能文の状態に関する情報を取得できます。

ビュー 説明

DBA_RESUMABLE

USER_RESUMABLE

これらのビューには、現在実行中または一時停止しているすべての再開可能文に関する行が含まれます。これらは、再開可能文の実行状態を監視したり、再開可能文に関する特定の情報を取得するために、DBA、AFTER SUSPENDトリガーまたは別のセッションが使用できます。

V$SESSION_WAIT

ある文が一時停止すると、その文を起動したセッションは待機状態になります。このビューには、「文が一時停止され、エラーのクリアを待機しています」という内容のEVENT列を持つセッションに対して1行が挿入されます。

19.2.4.3 DBMS_RESUMABLEパッケージの使用方法

DBMS_RESUMABLEパッケージは、再開可能領域割当ての管理に役立ちます。

次のプロシージャを起動できます。

プロシージャ 説明

ABORT(sessionID)

このプロシージャは、一時停止した再開可能文を強制終了します。パラメータsessionIDは、文が実行されているセッションIDです。パラレルDML/DDLの場合、sessionIDはパラレルDML/DDLに参加している任意のセッションIDです。

Oracle Databaseでは、ABORT操作が常に正常終了することが保証されています。これは、AFTER SUSPENDトリガーの内部からでも外部からでもコールできます。

ABORTのコール元は、sessionIDを持つセッションの所有者、ALTER SYSTEM権限を持っているユーザー、DBA権限を持っているユーザーのいずれかである必要があります。

GET_SESSION_TIMEOUT(sessionID)

このファンクションは、sessionIDを持つセッションで設定されている再開可能領域割当ての現行のタイムアウト値を返します。タイムアウトは秒数で返されます。セッションが存在しない場合、このファンクションは-1を返します。

SET_SESSION_TIMEOUT(sessionID, timeout)

このプロシージャは、sessionIDを持つセッションに対して再開可能領域割当てのタイムアウト間隔を設定します。パラメータtimeoutの単位は秒数です。新しいtimeout設定は、即時にセッションに適用されます。セッションが存在しない場合は何も起こりません。

GET_TIMEOUT()

このファンクションは、現行セッションで設定されている再開可能領域割当ての現行のtimeout値を返します。戻される値は秒で示されます。

SET_TIMEOUT(timeout)

このプロシージャは、現行セッションに対して再開可能領域割当てのtimeout値を設定します。パラメータtimeoutの単位は秒数です。新しいタイムアウト設定はセッションに即時適用されます。

関連項目:

DBMS_RESUMABLEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

19.2.5 操作一時停止アラート

再開可能セッションが一時停止されると、操作を完了するためにリソースを割り当てる必要があるオブジェクトに対して、操作一時停止アラートが発行されます。

リソースが割り当てられて操作が完了すると、操作一時停止アラートはクリアされます。システム生成アラートの詳細は、「表領域のアラートの管理」を参照してください。

19.2.6 再開可能領域割当ての例: AFTER SUSPENDトリガーの登録

この例では、システム全体で有効なAFTER SUSPENDトリガーを作成し、ユーザーSYSとしてデータベース・レベルで登録する方法を示します。

任意のセッションで再開可能文が一時停止すると、このトリガーは次の2つのうちどちらかの処理を実行します。

  • UNDOセグメントが領域上限に達した場合は、メッセージがDBAに送られ、文が強制終了します。

  • 他のリカバリ可能なエラーが発生した場合には、タイムアウト間隔が8時間にリセットされます。

この例で使用する文を次に示します。

CREATE OR REPLACE TRIGGER resumable_default
AFTER SUSPEND
ON DATABASE
DECLARE
   /* declare transaction in this trigger is autonomous */
   /* this is not required because transactions within a trigger
      are always autonomous */
   PRAGMA AUTONOMOUS_TRANSACTION;
   cur_sid           NUMBER;
   cur_inst          NUMBER;
   errno             NUMBER;
   err_type          VARCHAR2;
   object_owner      VARCHAR2;
   object_type       VARCHAR2;
   table_space_name  VARCHAR2;
   object_name       VARCHAR2;
   sub_object_name   VARCHAR2;
   error_txt         VARCHAR2;
   msg_body          VARCHAR2;
   ret_value         BOOLEAN;
   mail_conn         UTL_SMTP.CONNECTION;
BEGIN
   -- Get session ID
   SELECT DISTINCT(SID) INTO cur_SID FROM V$MYSTAT;

   -- Get instance number
   cur_inst := userenv('instance');

   -- Get space error information
   ret_value := 
   DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,object_type,object_owner,
        table_space_name,object_name, sub_object_name);
   /*
   -- If the error is related to undo segments, log error, send email
   -- to DBA, and abort the statement. Otherwise, set timeout to 8 hours.
   -- 
   -- sys.rbs_error is a table which is to be
   -- created by a DBA manually and defined as
   -- (sql_text VARCHAR2(1000), error_msg VARCHAR2(4000),
   -- suspend_time DATE)
   */

   IF OBJECT_TYPE = 'UNDO SEGMENT' THEN
       /* LOG ERROR */
       INSERT INTO sys.rbs_error (
           SELECT SQL_TEXT, ERROR_MSG, SUSPEND_TIME
           FROM DBMS_RESUMABLE
           WHERE SESSION_ID = cur_sid AND INSTANCE_ID = cur_inst
        );
       SELECT ERROR_MSG INTO error_txt FROM DBMS_RESUMABLE 
           WHERE SESSION_ID = cur_sid and INSTANCE_ID = cur_inst;

        -- Send email to receipient through UTL_SMTP package
        msg_body:='Subject: Space Error Occurred

                   Space limit reached for undo segment ' || object_name || 
                   on ' || TO_CHAR(SYSDATE, 'Month dd, YYYY, HH:MIam') ||
                   '. Error message was ' || error_txt;

        mail_conn := UTL_SMTP.OPEN_CONNECTION('localhost', 25);
        UTL_SMTP.HELO(mail_conn, 'localhost');
        UTL_SMTP.MAIL(mail_conn, 'sender@localhost');
        UTL_SMTP.RCPT(mail_conn, 'recipient@localhost');
        UTL_SMTP.DATA(mail_conn, msg_body);
        UTL_SMTP.QUIT(mail_conn);

        -- Abort the statement
        DBMS_RESUMABLE.ABORT(cur_sid);
    ELSE
        -- Set timeout to 8 hours
        DBMS_RESUMABLE.SET_TIMEOUT(28800);
    END IF;

    /* commit autonomous transaction */
    COMMIT;   
END;
/

19.3 未使用領域の再利用

未使用領域を再利用できます。セグメント・アドバイザはOracle Databaseコンポーネントで、再利用可能な領域があるセグメントを識別します。

19.3.1 未使用領域の再利用について

時間の経過とともに、表領域内のオブジェクトを更新および削除すると、新しいデータに対して個別に再利用するには不十分な小さい空き領域が作成されます。このような空き領域は、断片化された空き領域と呼ばれます。

オブジェクトに断片化された空き領域があると、結果的に多くの無駄な領域が生じ、データベースのパフォーマンスに影響を与える場合があります。断片化を解消して領域を再生するには、オンラインによるセグメントの縮小を実行することをお薦めします。このプロセスは、最高水位標の下の断片化された空き領域を統合し、セグメントを圧縮します。圧縮すると最高水位標が移動し、その結果、最高水位標の上に新しい空き領域ができます。その後、この最高水位標よりも上の領域は、割当て解除されます。セグメントは、この操作の開始から終了までの大半で、問合せおよびDMLを使用でき、特別なディスク領域の割当ては不要です。

オンラインによるセグメントの縮小で利点を得られるセグメントを特定するには、セグメント・アドバイザを使用します。セグメント・アドバイザは、自動セグメント領域管理(ASSM)を備えたローカル管理表領域のセグメントに対してのみ使用できます。調査可能なセグメントの種類については、他にも制限があります。詳細は、「オンラインによるデータベース・セグメントの縮小」を参照してください。

再生可能な領域を含む表がオンラインによるセグメントの縮小に適していない場合、または領域の再生中に表の論理属性または物理属性を変更する場合は、セグメントの縮小にかわる手段として、表のオンライン再定義を使用できます。オンライン再定義は再編成とも呼ばれます。オンライン再定義は、オンラインによるセグメントの縮小とは異なり、別のディスク領域を割り当てる必要があります。詳細は、「表のオンライン再定義」を参照してください。

19.3.2 セグメント・アドバイザ

セグメント・アドバイザは、再生に使用できる領域があるセグメントを特定します。

19.3.2.1 セグメント・アドバイザについて

セグメント・アドバイザは、自動ワークロード・リポジトリ(AWR)の使用状況と増加に関する統計情報を調べ、セグメントのデータをサンプリングして、分析を実行します。

メンテナンス・ウィンドウの間に自動化メンテナンス・タスクとして実行されるように構成されていますが、オンデマンド(手動)で実行することもできます。セグメント・アドバイザの自動化メンテナンス・タスクのことを、自動セグメント・アドバイザと呼びます。この情報は、容量を計画したり、縮小するセグメントを決定するときに使用できます。

セグメント・アドバイザは、次の種類のアドバイスを生成します。

  • セグメント・アドバイザにより、オブジェクトにかなりの量の空き領域があることが判断されると、オンラインによるセグメントの縮小が提案されます。自動セグメント領域管理のない表領域内の表の場合など、オブジェクトがセグメントの縮小に適さない表である場合は、オンラインによる表の再定義が提案されます。

  • 高度な行圧縮方法を使用して表を圧縮することで効果が期待できるとセグメント・アドバイザが判断した場合、そのことを推奨事項として表示します。(自動セグメント・アドバイザの場合のみ。「自動セグメント・アドバイザ」を参照。)

  • セグメント・アドバイザにより、特定のしきい値を超える行連鎖のある表が検出されると、表に過剰な連鎖行があることが記録されます。

    ノート:

    セグメント・アドバイザによるフラグ設定の対象は、行を長くする更新によって生じた行連鎖のタイプのみです。

領域管理のアラートを受け取った場合、または領域の再生を決定した場合は、セグメント・アドバイザを開始してください。

19.3.2.2 セグメント・アドバイザの使用

セグメント・アドバイザを使用するには、自動セグメント・アドバイザの結果を確認し、オプションで、手動でセグメント・アドバイザを実行します。

セグメント・アドバイザを使用するには:

  1. 自動セグメント・アドバイザの結果を確認します。

    自動セグメント・アドバイザを理解するには、この後の「自動セグメント・アドバイザ」を参照してください。結果の表示方法の詳細は、「セグメント・アドバイザの結果の表示」を参照してください。

  2. (オプション)セグメント・アドバイザを手動で再実行し、個々のセグメントの更新結果を取得します。

    この後の「手動によるセグメント・アドバイザの実行」を参照してください。

19.3.2.3 自動セグメント・アドバイザ

自動セグメント・アドバイザは、すべてのメンテナンス・ウィンドウ内で実行するように構成されている自動化メンテナンス・タスクです。

自動セグメント・アドバイザは、すべてのデータベース・オブジェクトを分析するわけではありません。かわりに、データベース統計を調査し、セグメント・データをサンプリングした後、次のような分析対象オブジェクトを選択します。

  • 領域のクリティカルまたは警告のしきい値を超えた表領域

  • アクティビティが最も多いセグメント

  • 増加率が最も高いセグメント

また、自動セグメント・アドバイザでは、高度な行圧縮方法で圧縮した場合に節約できる領域の大きさを判断するために、10MB以上で、索引が3つ以上存在する表が評価されます。

分析対象オブジェクトが選択されても、セグメント・アドバイザがオブジェクトを処理する前にメンテナンス・ウィンドウが終了する場合、そのオブジェクトは、自動セグメント・アドバイザの次回の実行に組み込まれます。

自動セグメント・アドバイザによって分析対象として選択された表領域とセグメントのセットは変更できません。ただし、自動セグメント・アドバイザのタスクの有効化または無効化、自動セグメント・アドバイザの実行予定回数、または自動化メンテナンス・タスクのシステム・リソース使用率は変更できます。詳細は、「自動セグメント・アドバイザの構成」を参照してください。

19.3.2.4 手動によるセグメント・アドバイザの実行

セグメント・アドバイザは、Cloud ControlまたはPL/SQLパッケージのプロシージャ・コールを使用して、いつでも手動で実行できます。

セグメント・アドバイザを手動で実行する理由には、次のものがあります。

  • 自動セグメント・アドバイザが選択しなかった表領域またはセグメントを分析するため。

  • 個々の表領域またはセグメントを再度分析して、最新の推奨事項を入手するため。

セグメント・アドバイザには、3種類のレベルでアドバイスを要求できます。

  • セグメント・レベル: 非パーティション表、パーティション表のパーティションまたはサブパーティション、索引、またはLOB列など、単一のセグメントに対してアドバイスが生成されます。

  • オブジェクト・レベル: 表や索引など、オブジェクト全体についてアドバイスが生成されます。オブジェクトがパーティション化されている場合は、オブジェクトのすべてのパーティションに対してアドバイスが生成されます。また、Cloud Controlからセグメント・アドバイザを手動で実行する場合は、表の索引やLOBセグメントなど、オブジェクトの依存オブジェクトについてアドバイスを要求できます。

  • 表領域レベル: 表領域のすべてのセグメントに対してアドバイスが生成されます。

表19-2にあるOBJECT_TYPE列は、アドバイスを要求できるオブジェクトのタイプを示しています。

19.3.2.4.1 Cloud Controlを使用したセグメント・アドバイザの手動実行

Cloud Controlを使用して、セグメント・アドバイザを手動で実行できます

Cloud Controlを使用してセグメント・アドバイザを手動で実行するには、OEM_ADVISORロールが付与されている必要があります。セグメント・アドバイザを実行するには、次の2つの方法があります。

  • セグメント・アドバイザ・ウィザードの使用

    この方法を使用すると、表領域レベルまたはオブジェクト・レベルでアドバイスを要求できます。オブジェクト・レベルでは、表、索引、表パーティションおよび索引パーティションについてアドバイスを要求できます。

  • スキーマ・オブジェクトを表示するページでの「セグメント・アドバイザの実行」コマンドの使用。

    たとえば、(「スキーマ」メニューからアクセス可能な)「表」ページに表を表示する場合は、表を選択して「アクション」メニューから「セグメント・アドバイザの実行」を選択します。

    この方法では、スキーマ・オブジェクトの依存オブジェクトをセグメント・アドバイザの実行対象に含めることができます。たとえば、表を選択して「セグメント・アドバイザの実行」を選択すると、パーティション、索引セグメント、LOBセグメントなど、表の依存オブジェクトが表示されます。依存オブジェクトを選択することで、そのオブジェクトを実行対象に指定できます。

両方の場合に、Cloud Controlは、Oracle Database Schedulerジョブとしてセグメント・アドバイザ・タスクを作成します。即座に実行するようにジョブをスケジュールすることも、スケジューラが提供する高度なスケジューリング機能を利用することもできます。

セグメント・アドバイザ・ウィザードを使用してセグメント・アドバイザを手動で実行するには:

  1. データベース・ホームページにアクセスします。

  2. 「パフォーマンス」メニューから、「アドバイザ・ホーム」を選択します。

    「アドバイザ・セントラル」ページが表示されます。(図19-2を参照してください。)

  3. 「アドバイザ」の下の「セグメント・アドバイザ」をクリックします。

    セグメント・アドバイザ・ウィザードの最初のページが表示されます。

  4. セグメント・アドバイザのジョブをスケジュールするウィザードの各ステップに従い、ウィザードの最終ページで「発行」をクリックします。

    「アドバイザ・セントラル」ページが表示され、「結果」ヘッダーの下のリストの最初に新しいセグメント・アドバイザ・ジョブが表示されます。ジョブ・ステータスは、SCHEDULEDまたはRUNNINGになります。(自分のジョブが表示されない場合は、リストの上の検索フィールドを使用して表示してください。)

  5. ジョブのステータスをチェックします。COMPLETEDでない場合は、ページの上部にある「リフレッシュ」コントロールを使用してページをリフレッシュします。(ブラウザのリフレッシュ・アイコンは使用しないでください。)

    ジョブ・ステータスがCOMPLETEDに変わった場合は、「選択」列をクリックしてジョブを選択し、「結果の表示」をクリックします。

    図19-2 「アドバイザ・セントラル」ページ

    図19-2の説明が続きます
    「図19-2 「アドバイザ・セントラル」ページ」の説明

関連項目:

スケジューラの高度なスケジューリング機能の詳細は、「Oracle Schedulerを使用したジョブのスケジューリング」を参照してください。

19.3.2.4.2 PL/SQLを使用したセグメント・アドバイザの手動実行

セグメント・アドバイザは、DBMS_ADVISORパッケージを使用して実行できます。

パッケージ・プロシージャを使用してセグメント・アドバイザのタスクを作成し、タスクの引数を設定してからタスクを実行します。そのためには、ADVISOR権限が必要です。表19-1に、セグメント・アドバイザに関連するプロシージャを示します。これらのプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

表19-1 セグメント・アドバイザに関連するDBMS_ADVISORパッケージ・プロシージャ

パッケージ・プロシージャ名 説明

CREATE_TASK

このプロシージャを使用して、セグメント・アドバイザのタスクを作成します。ADVISOR_NAMEパラメータの値に、'Segment Advisor'を指定します。

CREATE_OBJECT

このプロシージャを使用して、セグメント領域のアドバイス対象オブジェクトを識別します。このプロシージャのパラメータ値は、オブジェクト・タイプによって異なります。表19-2に、各オブジェクト・タイプのパラメータ値を示します。

ノート: IOTオーバーフロー・セグメントについてアドバイスを要求するには、TABLETABLE PARTITIONまたはTABLE SUBPARTITIONのオブジェクト型を使用します。次の問合せを使用して、IOTのオーバーフロー・セグメントを検索し、CREATE_OBJECTで使用するオーバーフロー・セグメントの表名を判断します。

select table_name, iot_name, iot_type from dba_tables;

SET_TASK_PARAMETER

このプロシージャを使用して、必要なセグメント・アドバイスを指定します。表19-3に、このプロシージャに関連する入力パラメータを示します。リストされていないパラメータは、セグメント・アドバイザでは使用されません。

EXECUTE_TASK

このプロシージャを使用して、セグメント・アドバイザのタスクを実行します。

表19-2 DBMS_ADVISOR.CREATE_OBJECTの入力パラメータ

OBJECT_TYPE ATTR1 ATTR2 ATTR3 ATTR4

TABLESPACE

表領域名

NULL

NULL

未使用。NULLを指定します。

TABLE

スキーマ名

表名

NULL

未使用。NULLを指定します。

INDEX

スキーマ名

索引名

NULL

未使用。NULLを指定します。

TABLE PARTITION

スキーマ名

表名

表パーティション名

未使用。NULLを指定します。

INDEX PARTITION

スキーマ名

索引名

索引パーティション名

未使用。NULLを指定します。

TABLE SUBPARTITION

スキーマ名

表名

表サブパーティション名

未使用。NULLを指定します。

INDEX SUBPARTITION

スキーマ名

索引名

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

未使用。NULLを指定します。

LOB

スキーマ名

セグメント名

NULL

未使用。NULLを指定します。

LOB PARTITION

スキーマ名

セグメント名

LOBパーティション名

未使用。NULLを指定します。

LOB SUBPARTITION

スキーマ名

セグメント名

LOBサブパーティション名

未使用。NULLを指定します。

表19-3 DBMS_ADVISOR.SET_TASK_PARAMETERの入力

入力パラメータ 説明 使用可能な値 デフォルト値

time_limit

セグメント・アドバイザを実行する時間制限を秒単位で指定します。

任意の秒数。

UNLIMITED

recommend_all

セグメント・アドバイザですべてのセグメントについて結果を生成するかどうかを指定します。

TRUE: 領域再生の推奨事項に関係なく、指定されたすべてのセグメントに対して結果が生成されます。

FALSE: 領域再生の推奨事項を生成するオブジェクトに対してのみ結果が生成されます。

TRUE

次の例は、DBMS_ADVISORプロシージャを使用して、サンプル表hr.employeesに対してセグメント・アドバイザを実行する方法を示しています。これらのパッケージ・プロシージャを実行するユーザーには、そのパッケージに対するオブジェクトのEXECUTE権限、またはADVISORシステム権限が必要です。

オブジェクト型TABLEDBMS_ADVISOR.CREATE_OBJECTに渡すと、オブジェクト・レベルを要求したことになります。表がパーティション化されていない場合は、表セグメントが分析されます(索引またはLOBセグメントなどの依存セグメントは対象外です)。表がパーティション化されている場合は、すべての表パーティションが分析され、個別に結果と推奨事項が生成されます。

variable id number;
begin
  declare
  name varchar2(100);
  descr varchar2(500);
  obj_id number;
  begin
  name:='Manual_Employees';
  descr:='Segment Advisor Example';

  dbms_advisor.create_task (
    advisor_name     => 'Segment Advisor',
    task_id          => :id,
    task_name        => name,
    task_desc        => descr);

  dbms_advisor.create_object (
    task_name        => name,
    object_type      => 'TABLE',
    attr1            => 'HR',
    attr2            => 'EMPLOYEES',
    attr3            => NULL,
    attr4            => NULL,
    attr5            => NULL,
    object_id        => obj_id);

  dbms_advisor.set_task_parameter(
    task_name        => name,
    parameter        => 'recommend_all',
    value            => 'TRUE');

  dbms_advisor.execute_task(name);
  end;
end; 
/
19.3.2.5 セグメント・アドバイザの結果の表示

セグメント・アドバイザでは、様々な種類の結果(推奨事項、結果、処置、オブジェクト)が作成されます。

次の方法で結果を表示できます。

  • Cloud Controlの使用

  • DBA_ADVISOR_*ビューの問合せ

  • DBMS_SPACE.ASA_RECOMMENDATIONSファンクションのコール

表19-4に、様々な種類の結果および関連するDBA_ADVISOR_*ビューを示します。

表19-4 セグメント・アドバイザの結果の種類

結果の種類 関連するビュー 説明

推奨事項

DBA_ADVISOR_RECOMMENDATIONS

セグメントの縮小、再編成または圧縮が効果的な場合は、そのセグメントに対して推奨事項が生成されます。表19-5に、生成される結果および推奨事項の例を示します。

結果

DBA_ADVISOR_FINDINGS

結果とは、分析対象のセグメントでセグメント・アドバイザが観察した内容のレポートです。結果には、分析対象の各セグメントの使用領域と空き領域の統計情報が含まれます。すべての結果が推奨事項になるわけではありません。(推奨事項は少数でも、多くの結果がある場合もあります。)セグメント・アドバイザをPL/SQLを使用して手動で実行する際に、SET_TASK_PARAMETERプロシージャのrecommend_all'TRUE'に指定すると、セグメントに対する推奨事項があってもなくても、分析の対象になる各セグメントに対する結果が生成されます。行連鎖アドバイスの場合、自動セグメント・アドバイザは結果のみを生成し、推奨事項は生成しません。自動セグメント・アドバイザに領域の再生に関する推奨事項がない場合、結果は生成されません。ただし、高度な行圧縮の効果が期待できる表に対しては、自動セグメント・アドバイザの結果が生成される場合があります。

処置

DBA_ADVISOR_ACTIONS

すべての推奨事項は、セグメントの縮小、オンライン再定義(再編成)または圧縮の実施を提案する処置に関連付けられます。DBA_ADVISOR_ACTIONSビューには、セグメントの縮小または表の圧縮を実行するために使用できるSQL、またはオブジェクトを再編成するための提案が表示されます。

オブジェクト

DBA_ADVISOR_OBJECTS

すべての結果、推奨事項および処置はオブジェクトに関連付けられています。表領域やパーティション表の場合のように、複数のセグメントをセグメント・アドバイザが分析する場合、分析対象のセグメントごとに1つのエントリがDBA_ADVISOR_OBJECTSビューに作成されます。表19-2には、分析対象のセグメントに関する情報を問い合せるための、このビューの列が定義されています。結果、推奨事項および処置のビューのオブジェクトを、このビューのオブジェクトと関係づけることができます。

関連項目:

DBMS_SPACE.ASA_RECOMMENDATIONSファンクションの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

19.3.2.5.1 Cloud Controlを使用したセグメント・アドバイザの結果の表示

Cloud Controlでは、自動セグメント・アドバイザの実行とセグメント・アドバイザの手動実行の両方についてセグメント・アドバイザの結果を表示できます。

次の種類の結果を表示できます。

  • すべての推奨事項(自動および手動によるセグメント・アドバイザの複数の実行)

  • 自動セグメント・アドバイザの最新の実行での推奨事項

  • 特定の実行での推奨事項

  • 行連鎖の結果

自動セグメント・アドバイザの最新の実行で分析されたセグメントを一覧に表示することもできます。

Cloud Controlを使用してセグメント・アドバイザの結果を表示するには-すべての実行:

  1. データベース・ホームページにアクセスします。

  2. 「管理」メニューから、「記憶域」を選択し、「セグメント・アドバイザ」を選択します。

    「セグメント・アドバイザ推奨」ページが表示されます。推奨事項は、表領域別に編成されます。

  3. 推奨事項が提示されている場合は、表領域を選択し、次に「推奨事項の詳細」をクリックします。

    「推奨事項の詳細」ページが表示されます。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。

    ノート:

    エラーが発生するため、LOBを縮小または再編成しないでください。

    ヒント:

    リストのエントリは、再生可能領域の大きい順にソートされています。列ヘッダーをクリックすると、ソート順を変更したり、昇順から降順に変更できます。

Cloud Controlを使用してセグメント・アドバイザの結果を表示するには-自動セグメント・アドバイザの最新の実行:

  1. データベース・ホームページにアクセスします。

  2. 「管理」メニューから、「記憶域」を選択し、「セグメント・アドバイザ」を選択します。

    「セグメント・アドバイザ推奨」ページが表示されます。推奨事項は、表領域別に編成されます。

    「セグメント・アドバイザ推奨」ページが表示されます。

  3. 「表示」リストで、「最後の自動実行からの推奨事項」を選択します。

  4. 推奨事項が提示されている場合は、表領域を選択し、「推奨事項の詳細」をクリックします。

    「推奨事項の詳細」ページが表示されます。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。

ノート:

エラーが発生するため、LOBを縮小または再編成しないでください。

Cloud Controlを使用してセグメント・アドバイザの結果を表示するには-特定の実行:

  1. データベース・ホームページにアクセスします。

  2. 「パフォーマンス」メニューから、「アドバイザ・ホーム」を選択します。

    「アドバイザ・セントラル」ページが表示されます。(図19-2を参照してください。)

  3. タスクが「結果」ヘッダーの下のリストに表示されていることを確認します。タスクがない場合は、次のステップを実行します。

    1. ページの「検索」セクションのアドバイザ・タイプで、「セグメント・アドバイザ」を選択します。

    2. 「アドバイザ実行」リストで、「すべて」または該当する期間を選択します。

    3. (オプション)タスク名を入力します。

    4. 「実行」をクリックします。

      「結果」セクションにセグメント・アドバイザのタスクが表示されます。

  4. ジョブのステータスをチェックします。COMPLETEDでない場合は、ページの上部にある「リフレッシュ」コントロールを使用してページをリフレッシュします。(ブラウザのリフレッシュ・アイコンは使用しないでください。)

  5. タスク名をクリックします。

    セグメント・アドバイザのタスクのページに、表領域別に編成された推奨事項が表示されます。

  6. リストで表領域を選択して、「推奨事項の詳細」をクリックします。

    「推奨事項の詳細」ページが表示されます。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。

行連鎖の結果を表示するには:

  1. データベース・ホームページにアクセスします。

  2. 「管理」メニューから、「記憶域」を選択し、「セグメント・アドバイザ」を選択します。

    「セグメント・アドバイザ推奨」ページが表示されます。推奨事項は、表領域別に編成されます。

    「セグメント・アドバイザ推奨」ページが表示されます。

  3. 「関連リンク」ヘッダーの下にある「行チェーン分析」をクリックします。

    「行チェーン分析」ページには、連鎖行があるすべてのセグメントと各連鎖行の割合が表示されます。

19.3.2.5.2 DBA_ADVISOR_*ビューの問合せによるセグメント・アドバイザの結果の表示

DBA_ADVISOR_*ビューを問い合せて、セグメント・アドバイザの結果を表示できます。

表19-5のヘッダーには、セグメント・アドバイザからの出力が表示されるDBA_ADVISOR_*ビューの列が示されます。これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。この表に、考えられる出力の要約を示します。また、表19-2に、分析されたセグメントの情報が表示されるDBA_ADVISOR_OBJECTSビューの列を示します。

DBA_ADVISOR_*ビューを問い合せる前に、DBA_ADVISOR_TASKSSTATUS列を問い合せることで、セグメント・アドバイザのタスクが完了していることを確認できます。

select task_name, status from dba_advisor_tasks
   where owner = 'STEVE' and advisor_name = 'Segment Advisor';
 
TASK_NAME                      STATUS
------------------------------ -----------
Manual Employees               COMPLETED

次の例は、ユーザーSTEVEが発行したセグメント・アドバイザのすべての実行から結果を取得するために、DBA_ADVISOR_*ビューを問い合せる方法を示しています。

select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message 
  from dba_advisor_findings af, dba_advisor_objects ao
  where ao.task_id = af.task_id
  and ao.object_id = af.object_id
  and ao.owner = 'STEVE';

TASK_NAME          SEGNAME      PARTITION       TYPE             MESSAGE
------------------ ------------ --------------- ---------------- --------------------------
Manual_Employees   EMPLOYEES                    TABLE            The free space in the obje
                                                                 ct is less than 10MB.
 
Manual_Salestable4 SALESTABLE4  SALESTABLE4_P1  TABLE PARTITION  Perform shrink, estimated
                                                                 savings is 74444154 bytes.
 
Manual_Salestable4 SALESTABLE4  SALESTABLE4_P2  TABLE PARTITION  The free space in the obje
                                                                 ct is less than 10MB.

表19-5 セグメント・アドバイザの結果: 要約

DBA_ADVISOR_FINDINGSのMESSAGE列 DBA_ADVISOR_FINDINGSのMORE_INFO列 DBA_ADVISOR_RECOMMENDATIONSのBENEFIT_TYPE列 DBA_ADVISOR_ACTIONSのATTR1列

情報が不十分なため、推奨事項を作成できません。

-

-

-

オブジェクト内の空き領域が10MB以下です。

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

-

-

オブジェクト内には空き領域がありますが、...のため縮小できません。

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

-

-

オブジェクト内の空き領域は前回のエクステントのサイズ未満です。

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

-

-

xxxバイトの節約が予測されるため、縮小を実行してください。

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

xxxバイトの節約が予測されるため、縮小を実行してください。

実行するコマンド。例: ALTER object SHRINK SPACE;)

schema.tableの行移動を有効にして縮小を実行してください。xxxバイトの節約が予測されるためです。

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

schema.tableの行移動を有効にして縮小を実行してください。xxxバイトの節約が予測されるためです。

実行するコマンド。例: ALTER object SHRINK SPACE;)

オブジェクトobjectの再編成を実行してください。xxxバイトの節約が予測されるためです。

(ノート: これは、オンラインによるセグメントの縮小に適していない再生可能な領域を持つオブジェクトに対する結果です。)

割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx

オブジェクトobjectの再編成を実行してください。xxxバイトの節約が予測されるためです。

再編成の実行

オブジェクトには、再編成によって削除できる連鎖行があります。

xxパーセントの連鎖行を再編成で削除できます。

-

-

オブジェクトobject_nameを圧縮してください。xxxバイトの節約が予測されるためです。

(この結果は、自動セグメント・アドバイザによってのみ生成されます)

オブジェクトobject_nameを圧縮してください。xxxバイトの節約が予測されるためです。

-

実行するコマンド。例: ALTER TABLE T1 ROW STORE COMPRESS ADVANCED

この結果については、DBA_ADVISOR_ACTIONSATTR2列も参照してください。

19.3.2.5.3 DBMS_SPACE.ASA_RECOMMENDATIONSを使用したセグメント・アドバイザの結果の表示

DBMS_SPACEパッケージのASA_RECOMMENDATIONSプロシージャは、自動セグメント・アドバイザの実行およびセグメント・アドバイザの手動実行に対する結果や推奨事項を含むネストされた表オブジェクトを返します。

このプロシージャでは、必要な結合がすべて実行され、使用しやすい形式で情報が返されるため、このプロシージャを呼び出す方が、DBA_ADVISOR_*ビューで作業するより簡単な場合があります。

次の問合せは、自動セグメント・アドバイザの最新の実行による推奨事項と、推奨事項に従うための実行コマンドの例を戻します。

select tablespace_name, segment_name, segment_type, partition_name,
recommendations, c1 from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));


TABLESPACE_NAME                SEGMENT_NAME                   SEGMENT_TYPE
------------------------------ ------------------------------ --------------
PARTITION_NAME
------------------------------
RECOMMENDATIONS
-----------------------------------------------------------------------------
C1
-----------------------------------------------------------------------------
TVMDS_ASSM                     ORDERS1                        TABLE PARTITION
ORDERS1_P2
Perform shrink, estimated savings is 57666422 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P2" shrink space
 
TVMDS_ASSM                     ORDERS1                        TABLE PARTITION
ORDERS1_P1
Perform shrink, estimated savings is 45083514 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P1" shrink space
 
TVMDS_ASSM_NEW                 ORDERS_NEW                     TABLE
 
Perform shrink, estimated savings is 155398992 bytes.
alter table "STEVE"."ORDERS_NEW" shrink space
 
TVMDS_ASSM_NEW                 ORDERS_NEW_INDEX               INDEX
 
Perform shrink, estimated savings is 102759445 bytes.
alter index "STEVE"."ORDERS_NEW_INDEX" shrink space

DBMS_SPACE.ASA_RECOMMENDATIONSの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

19.3.2.6 自動セグメント・アドバイザの構成

自動セグメント・アドバイザは自動化メンテナンス・タスクの1つです。そのため、このタスクの実行時に変更を加える場合は、Cloud ControlまたはPL/SQLパッケージ・プロシージャ・コールを使用できます。適切なリソース・プランを変更することで、タスクに割り当てられているリソースを制御することもできます。

これらはPL/SQLパッケージ・プロシージャをコールして変更できますが、Cloud Controlを使用する方がさらに簡単です。

Cloud Controlを使用して自動セグメント・アドバイザのタスクを構成するには:

  1. ユーザーSYSTEMとしてCloud Controlにログインします。
  2. 「データベース・ホーム」ページにアクセスします。
  3. 「管理」メニューから、「記憶域」を選択し、「セグメント・アドバイザ」を選択します。

    「セグメント・アドバイザ推奨」ページが表示されます。

  4. 「関連リンク」ヘッダーの下にある「自動化メンテナンス・タスク」リンクをクリックします。

    自動化メンテナンス・タスク・ページが表示されます。

  5. 「構成」をクリックします。

    「自動化メンテナンス・タスク構成」ページが表示されます。

  6. 自動セグメント・アドバイザを完全に無効化するには、「タスク設定」の下にある「セグメント・アドバイザ」ラベルの横の「無効」を選択して、「適用」をクリックします。
  7. 特定のメンテナンス・ウィンドウの自動セグメント・アドバイザを無効化するには、「セグメント・アドバイザ」列の下の該当するチェック・ボックスをクリアし、「適用」をクリックします。
  8. メンテナンス・ウィンドウの開始時間、終了時間および継続時間を変更するには、「ウィンドウ・グループの編集」をクリックします。

    ウィンドウ・グループの編集ページが表示されます。メンテナンス・ウィンドウの名前をクリックして「編集」をクリックし、ウィンドウのスケジュールを変更します。

19.3.2.7 自動セグメント・アドバイザ情報の表示

ビューを問い合せて、自動セグメント・アドバイザに固有の情報を表示できます。

ビュー 説明

DBA_AUTO_SEGADV_SUMMARY

このビューには、各行に1件ずつ自動セグメント・アドバイザの実行が要約されます。フィールドには、処理された表領域やセグメントの数、および作成された推奨事項の件数が表示されます。

DBA_AUTO_SEGADV_CTL

自動セグメント・アドバイザがセグメントの選択および処理に使用する制御情報が表示されます。各行には、単一のオブジェクト(表領域またはセグメント)に関する情報(オブジェクトが処理されたかどうか、処理された場合はオブジェクトを処理したタスクIDやその選択理由など)が格納されます。

19.3.3 オンラインによるデータベース・セグメントの縮小

Oracle Databaseセグメントの最高水位標の下の断片化された空き領域を再生するには、オンラインによるセグメントの縮小を使用します。

セグメントの縮小の利点は、次のとおりです。

  • データの縮小はキャッシュ利用の向上につながります。つまり、オンライン・トランザクション処理(OLTP)のパフォーマンスが改善されます。

  • データが縮小されることで、全表スキャンを実行する際に必要なスキャン・ブロック数が少なくなります。つまり、意思決定支援システム(DSS)のパフォーマンスが改善されます。

セグメントの縮小は、オンラインのインプレース操作です。セグメント縮小のデータ移動フェーズでは、DML操作および問合せを発行できます。縮小操作の最後に領域が割当て解除される際は、短い時間ですが同時DML操作がブロックされます。索引は、縮小操作中も保持され、操作が完了した後も使用できます。セグメントの縮小では、余分なディスク領域の割当ては不要です。

セグメントの縮小では、最高水位標の上下両方の未使用領域を再生します。これに対して、領域の割当て解除では、最高水位標よりも上の未使用領域のみを再生します。縮小操作では、デフォルトの場合、セグメントを縮小して最高水位標を調整し、回復した領域が解放されます。

セグメントの縮小には、新しい位置への行の移動が必要です。したがって、最初に、縮小するオブジェクトの行を移動可能にし、オブジェクトに定義したROWIDベースのトリガーを無効にする必要があります。表内の行を移動可能にするには、ALTER TABLE ... ENABLE ROW MOVEMENTコマンドを使用します。

縮小操作は、自動セグメント領域管理(ASSM)を使用しているローカル管理表領域内のセグメントに対してのみ実行できます。ASSM表領域内では、次の表を除くすべてのセグメント・タイプがオンラインによるセグメントの縮小に適しています。

  • IOTマッピング表

  • ROWIDベースのマテリアライズド・ビューを備えた表

  • ファンクション索引がある表

  • SECUREFILE LOB

  • 次の圧縮メソッドで圧縮された表:

    • ROW STORE COMPRESS BASICを使用した基本表圧縮

    • COLUMN STORE COMPRESS FOR QUERYを使用したウェアハウス圧縮

    • COLUMN STORE COMPRESS FOR ARCHIVEを使用したアーカイブ圧縮

    ただし、ROW STORE COMPRESS ADVANCEDを使用した高度な行圧縮で圧縮された表は、オンラインのセグメント縮小の対象になります。表圧縮メソッドの詳細は、「表圧縮の使用」を参照してください。

ノート:

オンラインでデータベース・セグメントを縮小すると、依存データベース・オブジェクトが無効になることがあります。「オブジェクト依存性とオブジェクトの無効化について」を参照してください。

関連項目:

ALTER TABLEコマンドの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

オンラインによるセグメントの縮小の起動

オンラインによるセグメントの縮小を起動する前に、セグメント・アドバイザの結果および推奨事項を表示します。詳細は、「セグメント・アドバイザの使用」を参照してください。

Cloud ControlまたはSQL*PlusのSQLコマンドを使用して、オンラインによるセグメントの縮小を起動します。ここからは、コマンドラインによる方法について説明します。

ノート:

Cloud Controlの「推奨事項の詳細」ページから、セグメントの縮小を直接起動できます。また、Cloud Controlの個々の表に対してセグメントの縮小を起動するには、「表」ページに表を表示し、表を選択した後、「アクション」リストで「セグメントの縮小」をクリックします。(図19-1を参照してください。)Cloud Controlで同様の操作を実行すると、索引やマテリアライズド・ビューなどを縮小できます。

表、索引構成表、索引、パーティション、サブパーティション、マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの領域を縮小できます。この縮小には、SHRINK SPACE句を指定したALTER TABLEALTER INDEXALTER MATERIALIZED VIEW文またはALTER MATERIALIZED VIEW LOG文を使用します。

次の2つの句を必要に応じて使用することで、縮小操作の処理方法を制御できます。

  • COMPACT句を指定すると、セグメントの縮小操作を2つのフェーズに分割できます。COMPACTを指定すると、Oracle Databaseはセグメント領域の断片化を解消して表の行を縮小しますが、将来のある時点まで最高水位標のリセットおよび領域の割当て解除を延期します。このオプションは、操作に影響される可能性がある長時間実行される問合せがあり、再生されたブロックから読取りが試行される場合に役立ちます。断片化解消および縮小の結果は、第2のフェーズでデータの移動をやり直す必要がないように、ディスクに保存されます。第2のフェーズを完了するには、オフピーク時にCOMPACT句を指定せずにSHRINK SPACE句を再度発行します。

  • CASCADE句を指定すると、オブジェクトのすべての依存セグメントにセグメントの縮小操作が拡張されます。たとえば、表セグメントを縮小する際にCASCADEを使用すると、表のすべての索引も縮小されます。(パーティション表のパーティションを縮小するためにCASCADEを指定する必要はありません。)指定したオブジェクトの依存セグメントのリストを表示するには、DBMS_SPACEパッケージのOBJECT_DEPENDENT_SEGMENTSプロシージャを実行できます。

DDL操作と同様に、セグメントの縮小によって、後続のSQL文が再度解析されることになります。これは、COMPACT句を指定しないかぎり、カーソルが無効になるためです。

表およびその依存セグメント(BASICFILE LOBセグメントを含む)のすべてを縮小します。

ALTER TABLE employees SHRINK SPACE CASCADE;

BASICFILE LOBセグメントのみを縮小します。

ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);

パーティション表の単一パーティションを縮小します。

ALTER TABLE customers MODIFY PARTITION cust_P1 SHRINK SPACE;

IOT索引セグメントとオーバーフロー・セグメントを縮小します。

ALTER TABLE cities SHRINK SPACE CASCADE;

IOTオーバーフロー・セグメントのみを縮小します。

ALTER TABLE cities OVERFLOW SHRINK SPACE;

関連項目:

19.3.4 未使用領域の割当て解除

未使用領域の割当てを解除する場合は、未使用の(最高水位標)データベース・セグメントの最後で未使用領域を解放して、表領域の他のセグメントで領域を使用できるようにします。

割当て解除の前に、セグメントの最高水位標の位置および未使用領域の量に関する情報を返す、DBMS_SPACEパッケージのUNUSED_SPACEプロシージャを実行できます。自動セグメント領域管理を備えたローカル管理表領域のセグメントの場合は、SPACE_USAGEプロシージャを使用すると、未使用領域に関するより正確な情報が得られます。

関連項目:

DBMS_SPACEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

次の文は、セグメント(表、索引またはクラスタ)内の未使用領域の割当てを解除します。

ALTER TABLE table DEALLOCATE UNUSED KEEP integer;
ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;

KEEP句はオプションで指定でき、セグメントに保持される領域の量を指定できます。DBA_FREE_SPACEビューを調べることで、割当て解除された領域が開放されたことを確認できます。

関連項目:

19.4 未使用オブジェクト記憶域の削除

DBMS_SPACE_ADMINパッケージにはDROP_EMPTY_SEGMENTSプロシージャが含まれており、このプロシージャを使用すると、以前のリリースから移行された空の表およびパーティションのセグメントを削除できます。可能な場合には、索引セグメントなどの表の依存オブジェクトのセグメントもこれに含まれます。

次の例では、データベース内のすべての表から空のセグメントを削除しています。

BEGIN
  DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS();
END;

次は、HR.EMPLOYEES表から依存オブジェクトを含め空のセグメントを削除しています。

BEGIN
  DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS(
    schema_name  => 'HR',
    table_name   => 'EMPLOYEES');
END;

このプロシージャには、11.2.0以降との互換性が必要です。

関連項目:

このプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください

19.5 データ型の領域使用の理解

表またはその他のデータ構造を作成する際には、必要になる領域の大きさを把握しておく必要があります。領域要件は、データ型ごとに異なります。

『Oracle Database PL/SQL言語リファレンス』および『Oracle Database SQL言語リファレンス』には、データ型および領域要件の詳細な説明があります。

19.6 スキーマ・オブジェクトの領域使用情報の表示

Oracle Databaseには、スキーマ・オブジェクトの領域使用に関する情報を表示するためのデータ・ディクショナリ・ビューとPL/SQLパッケージが用意されています。

19.6.1 PL/SQLパッケージを使用したスキーマ・オブジェクトの領域使用情報の表示

DBMS_SPACEサブプログラムのセットを使用して、スキーマ・オブジェクトに関する情報を表示できます。

パッケージとプロシージャ/ファンクション 説明

DBMS_SPACE.UNUSED_SPACE

オブジェクト(表、索引またはクラスタ)の未使用領域に関する情報を返します。

DBMS_SPACE.FREE_BLOCKS

セグメントの空き領域が空きリストで管理されている(つまり、セグメント領域管理がMANUALである)オブジェクト(表、索引またはクラスタ)の空きデータ・ブロックに関する情報を返します。

DBMS_SPACE.SPACE_USAGE

セグメント領域管理がAUTOであるオブジェクト(表、索引またはクラスタ)の空きデータ・ブロックに関する情報を返します。

関連項目:

DBMS_SPACEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

例: DBMS_SPACE.UNUSED_SPACEの使用

次のSQL*Plusの例では、DBMS_SPACEパッケージを使用して、未使用領域情報を取得しています。

SQL> VARIABLE total_blocks NUMBER
SQL> VARIABLE total_bytes NUMBER
SQL> VARIABLE unused_blocks NUMBER
SQL> VARIABLE unused_bytes NUMBER
SQL> VARIABLE lastextf NUMBER
SQL> VARIABLE last_extb NUMBER
SQL> VARIABLE lastusedblock NUMBER
SQL> exec DBMS_SPACE.UNUSED_SPACE('SCOTT', 'EMP', 'TABLE', :total_blocks, -
>    :total_bytes,:unused_blocks, :unused_bytes, :lastextf, -
>    :last_extb, :lastusedblock);

PL/SQL procedure successfully completed.

SQL> PRINT

TOTAL_BLOCKS
------------
           5

TOTAL_BYTES
-----------
      10240

...

LASTUSEDBLOCK
-------------
            3

19.6.2 スキーマ・オブジェクトの領域使用のデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューのセットに、スキーマ・オブジェクトの領域使用に関する情報が表示されます。

次のビューには、スキーマ・オブジェクトの領域使用に関する情報が表示されます。

ビュー 説明

DBA_SEGMENTS

USER_SEGMENTS

DBAビューには、すべてのデータベース・セグメントに割り当てられている記憶域が表示されます。USERビューには、現行のユーザーのセグメントに割り当てられている記憶域が表示されます。

DBA_EXTENTS

USER_EXTENTS

DBAビューには、データベース内のすべてのセグメントを構成するエクステントが表示されます。USERビューには、現行のユーザーのセグメントを構成するエクステントが表示されます。

DBA_FREE_SPACE

USER_FREE_SPACE

DBAビューには、すべての表領域の使用可能エクステントが表示されます。USERビューには、ユーザーが割当て制限を持つ表領域の空き領域情報が表示されます。

19.6.2.1 例1: セグメント情報の表示

DBA_SEGMENTSビューを問い合せてセグメント情報を表示できます。

次の問合せは、スキーマhrの各索引セグメントの名前とサイズを返します。

SELECT SEGMENT_NAME, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
    FROM DBA_SEGMENTS
    WHERE SEGMENT_TYPE = 'INDEX'
    AND OWNER='HR'
    ORDER BY SEGMENT_NAME;

問合せ出力は、次のとおりです。

SEGMENT_NAME              TABLESPACE_NAME    BYTES BLOCKS EXTENTS
------------------------- --------------- -------- ------ -------
COUNTRY_C_ID_PK           EXAMPLE            65536     32       1
DEPT_ID_PK                EXAMPLE            65536     32       1
DEPT_LOCATION_IX          EXAMPLE            65536     32       1
EMP_DEPARTMENT_IX         EXAMPLE            65536     32       1
EMP_EMAIL_UK              EXAMPLE            65536     32       1
EMP_EMP_ID_PK             EXAMPLE            65536     32       1
EMP_JOB_IX                EXAMPLE            65536     32       1
EMP_MANAGER_IX            EXAMPLE            65536     32       1
EMP_NAME_IX               EXAMPLE            65536     32       1
JHIST_DEPARTMENT_IX       EXAMPLE            65536     32       1
JHIST_EMPLOYEE_IX         EXAMPLE            65536     32       1
JHIST_EMP_ID_ST_DATE_PK   EXAMPLE            65536     32       1
JHIST_JOB_IX              EXAMPLE            65536     32       1
JOB_ID_PK                 EXAMPLE            65536     32       1
LOC_CITY_IX               EXAMPLE            65536     32       1
LOC_COUNTRY_IX            EXAMPLE            65536     32       1
LOC_ID_PK                 EXAMPLE            65536     32       1
LOC_STATE_PROVINCE_IX     EXAMPLE            65536     32       1
REG_ID_PK                 EXAMPLE            65536     32       1

19 rows selected.
19.6.2.2 例2: エクステント情報の表示

DBA_EXTENTSデータ・ディクショナリ・ビューを問い合せて、データベース内の現在割り当てられているエクステントに関する情報を表示できます。

たとえば、次の問合せによって、hrスキーマの各索引セグメントに割り当てられているエクステントとそれらのエクステントのサイズが識別されます。

SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS
    FROM DBA_EXTENTS
    WHERE SEGMENT_TYPE = 'INDEX'
    AND OWNER='HR'
    ORDER BY SEGMENT_NAME;

問合せ出力は、次のとおりです。

SEGMENT_NAME              SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID    BYTES BLOCKS
------------------------- ------------ --------------- --------- -------- ------
COUNTRY_C_ID_PK           INDEX        EXAMPLE                 0    65536     32
DEPT_ID_PK                INDEX        EXAMPLE                 0    65536     32
DEPT_LOCATION_IX          INDEX        EXAMPLE                 0    65536     32
EMP_DEPARTMENT_IX         INDEX        EXAMPLE                 0    65536     32
EMP_EMAIL_UK              INDEX        EXAMPLE                 0    65536     32
EMP_EMP_ID_PK             INDEX        EXAMPLE                 0    65536     32
EMP_JOB_IX                INDEX        EXAMPLE                 0    65536     32
EMP_MANAGER_IX            INDEX        EXAMPLE                 0    65536     32
EMP_NAME_IX               INDEX        EXAMPLE                 0    65536     32
JHIST_DEPARTMENT_IX       INDEX        EXAMPLE                 0    65536     32
JHIST_EMPLOYEE_IX         INDEX        EXAMPLE                 0    65536     32
JHIST_EMP_ID_ST_DATE_PK   INDEX        EXAMPLE                 0    65536     32
JHIST_JOB_IX              INDEX        EXAMPLE                 0    65536     32
JOB_ID_PK                 INDEX        EXAMPLE                 0    65536     32
LOC_CITY_IX               INDEX        EXAMPLE                 0    65536     32
LOC_COUNTRY_IX            INDEX        EXAMPLE                 0    65536     32
LOC_ID_PK                 INDEX        EXAMPLE                 0    65536     32
LOC_STATE_PROVINCE_IX     INDEX        EXAMPLE                 0    65536     32
REG_ID_PK                 INDEX        EXAMPLE                 0    65536     32

19 rows selected.

hrスキーマの場合は、複数のエクステントが割り当てられているセグメントはありません。

19.6.2.3 例3: 表領域内の空き領域(エクステント)の表示

DBA_FREE_SPACEデータ・ディクショナリ・ビューを問い合せて、データベース内の空きエクステント(セグメントに割り当てられていないエクステント)に関する情報を表示できます。

たとえば、次の問合せは、SMUNDO表領域内の使用可能エクステントとして使用可能な空き領域を示します。

SELECT TABLESPACE_NAME, FILE_ID, BYTES, BLOCKS
    FROM DBA_FREE_SPACE
    WHERE TABLESPACE_NAME='SMUNDO';

問合せ出力は、次のとおりです。

TABLESPACE_NAME  FILE_ID    BYTES BLOCKS
--------------- -------- -------- ------
SMUNDO                 3    65536     32
SMUNDO                 3    65536     32
SMUNDO                 3    65536     32
SMUNDO                 3    65536     32
SMUNDO                 3    65536     32
SMUNDO                 3    65536     32
SMUNDO                 3   131072     64
SMUNDO                 3   131072     64
SMUNDO                 3    65536     32
SMUNDO                 3  3407872   1664

10 rows selected.

19.7 データベース・オブジェクトの容量計画

Oracle Databaseでは、Cloud ControlまたはDBMS_SPACE PL/SQLパッケージの2つの方法でデータベース・オブジェクトの容量を計画できます。DBMS_SPACEパッケージには、新しいオブジェクトのサイズを予測したり、既存のデータベース・オブジェクトのサイズを監視できる3つのプロシージャがあります。

ここでは、PL/SQLによる方法について説明します。Cloud Controlを使用した容量計画の詳細は、Cloud Controlのオンライン・ヘルプおよび「セグメント・アドバイザの使用」を参照してください。

19.7.1 表の領域使用の見積り

データベース表のサイズは、表領域の記憶域属性、表領域のブロック・サイズ、他の様々な要因によって大きく変化する可能性があります。DBMS_SPACEパッケージのCREATE_TABLE_COSTプロシージャを使用すると、表を作成する際の領域使用コストを予測できます。

このプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

プロシージャには、2つの異形があります。第1の異形は、行の平均サイズを使用してサイズを見積ります。第2の異形は、列情報を使用して表のサイズを見積ります。両方の異形ともに入力として次の値が必要です。

  • TABLESPACE_NAME: オブジェクトが作成される表領域。デフォルトはSYSTEM表領域です。

  • ROW_COUNT: 表の予測行数。

  • PCT_FREE: 更新の結果、既存の行を将来拡張するように各ブロックに確保する空き領域の割合(パーセンテージ)。

さらに、第1の異形には、AVG_ROW_SIZEの値も入力する必要があります。値は、予測された行サイズの平均をバイト単位で指定します。

また、第2の異形には、予想された各列値をCOLINFOSに指定する必要があります。この値は、属性COL_TYPE(列のデータ型)とCOL_SIZE(列の文字数またはバイト数)からなるオブジェクト型です。

このプロシージャでは、2つの値が戻ります。

  • USED_BYTES: ブロック・メタデータ、PCT_FREE領域などのオーバーヘッドを含め、データとして使用される実際のバイト数。

  • ALLOC_BYTES: 表領域のエクステントの特性を考慮してオブジェクトに割り当てられる予測した領域の大きさ。

ノート:

パーティション表のすべての新規セグメントについて、第1エクステントのデフォルトのサイズは64KBではなく8MBです。このことは、パーティション表に対する挿入と問合せのパフォーマンス向上に役立ちます。パーティション表の初期サイズが大きくても、十分なデータが挿入されると、領域消費は以前のリリースと同じになります。このデフォルトは、表の記憶域句にINITIALサイズを設定して上書きできます。この新しいデフォルトは、表パーティションおよびLOBパーティションにのみ適用されます。

19.7.2 索引の領域使用の見積り

DBMS_SPACEパッケージのCREATE_INDEX_COSTプロシージャを使用すると、既存の表に索引を作成する際の領域使用コストを予測できます。

プロシージャには次の値を入力する必要があります。

  • DDL: 索引を作成するCREATE INDEX文。このDDL文に指定する表は、既存の表であることが必要です。

  • PLAN_TABLE(オプション): 使用するPLAN TABLEの名前。デフォルトはNULLです。

このプロシージャから戻る結果は、セグメントに対して収集された統計によって異なります。したがって、このプロシージャを実行する直前に必ず統計を取得してください。最近の統計がない状態でもエラーになりませんが、不適切な結果が戻る可能性があります。このプロシージャでは、次の値が戻ります。

  • USED_BYTES: 実際の索引データを表すバイト数。

  • ALLOC_BYTES: 表領域の索引に割り当てられる領域の大きさ。

19.7.3 オブジェクト増加傾向の取得

DBMS_SPACEパッケージ・プロシージャのOBJECT_GROWTH_TREND関数では、特定の時点におけるオブジェクトの領域使用が各行に記述された1行以上の表が作成されます。

この関数は、自動ワークロード・リポジトリから領域使用の合計を取得するか、現在の領域使用を計算して、自動ワークロード・リポジトリから取得した領域使用の変更履歴と結合します。この関数のパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

関数には次の値を入力する必要があります。

  • OBJECT_OWNER: オブジェクトの所有者。

  • OBJECT_NAME: オブジェクトの名前。

  • PARTITION_NAME: 適切な場合は、表または索引パーティションの名前を指定します。それ以外の場合は、NULLを指定します。

  • OBJECT_TYPE: オブジェクトの種類。

  • START_TIME: 増加傾向分析の開始を示すTIMESTAMP値。

  • END_TIME: 増加傾向分析の終了を示すTIMESTAMP値。デフォルトはNOWです。

  • INTERVAL: 関数が領域使用情報を取得するレポート間隔の長さ(分単位)。

  • SKIP_INTERPOLATED: INTERVALの前後に記録された統計情報に基づいて、この関数が値を除外する('YES')かしない('NO')かを決定します。要求したレポート作成間隔と実際の記録間隔がどのように関連しているかをより明確に表示できるため、チャートではなく表として結果表が表示される場合には、この設定が便利です。

この関数は、1つの間隔のオブジェクトの領域使用情報が各行に示された表を返します。返される表が非常に大きい場合は、情報が作成されると同時に別のアプリケーションが使用できるように結果がパイプライン化されます。出力表には次の列があります。

  • TIMEPOINT: レポート間隔の時間を示すTIMESTAMP値。

    最も古いオブジェクトの記録統計よりも前のTIME値の記録は作成されません。

  • SPACE_USAGE: オブジェクト・データとして実際に使用されているバイト数。

  • SPACE_ALLOC: その時点で表領域のオブジェクトに割り当てられていたバイト数。

  • QUALITY: 要求されたレポート間隔と実際の統計記録が一致している程度を示す値。オブジェクト・サイズ使用統計には保証されているレポート間隔はなく、実際のレポート間隔は時間の経過およびオブジェクトによって変わるため、この情報が役立ちます。

    QUALITY列には、次の値が設定されます。

    • GOOD: 記録されたタイムスタンプが入力パラメータに指定したINTERVALの10%以内で、TIMEの値が記録統計に常に基づいている場合。

    • INTERPOLATED: 値はGOODの基準を満たしていないが、TIME値の前後の記録統計に基づいている場合。現在のインメモリー統計は、クラスタ内のすべてのインスタンスで収集でき、現時点の記録値として取り扱うことができます。

    • PROJECTION: 表が作成された時点ではTIME値が未来であった場合。Oracle Real Application Clusters環境では、統計の記録ルールによって、どのオブジェクトが選択されるかを各インスタンスが独自に選択できるようになっています。

    この関数から戻る出力は、Oracle RAC環境のすべてのインスタンスについて記録した値の集合です。各値は、GOODおよびINTERPOLATED値の組合せから計算できます。その値の少なくとも80%がGOODのインスタンス値から導出された場合、戻される集計値はGOODにマークされます。