ヘッダーをスキップ

Oracle Database 管理者ガイド
11gリリース1(11.1)

E05760-03
目次
目次
索引
索引

戻る 次へ

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

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

表領域のアラートの管理

Oracle Databaseでは、使用可能な領域が少なくなると事前にアラートで通知されるため、表領域のディスク領域を管理するのに役立ちます。デフォルトで、警告およびクリティカルの2つのアラートしきい値が定義されています。警告のしきい値は、領域が残り少なくなり始める境界値です。クリティカルのしきい値は、即時に注意を喚起する必要のある深刻な境界値です。データベースは、両方のしきい値でアラートを発行します。

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

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

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

アラートしきい値の設定

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

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

アラートしきい値の設定方法

例: ローカル管理表領域

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

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に設定します。データベース・デフォルトを使用する表領域はすべて新しいデフォルトに切り替わります。

アラートの表示

アラートを表示するには、Enterprise Manager Database Controlのホームページにアクセスします。


画像の説明

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

制限事項

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

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

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

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

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

ここでは、再開可能領域割当ての概要について説明します。再開可能領域割当ての動作について説明し、修飾文とエラー条件を具体的に定義します。

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

再開可能領域割当ての動作の概要は、次のとおりです。詳細はこの後の各項で説明します。

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

    • RESUMABLE_TIMEOUT初期化パラメータが0(ゼロ)以外の値に設定された。

    • ALTER SESSION ENABLE RESUMABLE文が発行された。

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

    • 領域不足条件

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

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

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

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

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

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

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

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

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

  7. 一時停止のタイムアウト間隔は、再開可能文に対応付けられています。タイムアウト間隔(デフォルトは2時間)の間一時停止していた再開可能文がリストアすると、ユーザーに例外が返されます。

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

再開可能な操作

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

訂正可能なエラー

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

再開可能領域割当てと分散処理

分散環境で、ユーザーが再開可能領域割当てを有効または無効にした場合、またはDBAとしてRESUMABLE_TIMEOUT初期化パラメータを変更した場合、その影響を受けるのはローカルのインスタンスのみです。分散トランザクションで、セッションまたはリモート・インスタンスが一時停止されるのは、RESUMABLEがリモート・インスタンスで有効な場合のみです。

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

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

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

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

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

再開可能領域割当ては、再開可能モードを有効にしたセッションの中で文を実行するときのみ可能です。再開可能領域割当ての有効化と無効化には2通りの方法があります。再開可能領域割当ては、RESUMABLE_TIMEOUT初期化パラメータを使用してシステム・レベルで制御するか、またはALTER SESSION文の句を使用してセッション・レベルで有効化できます。


注意:

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


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

再開可能領域割当てをシステム全体で有効化し、RESUMABLE_TIMEOUT初期化パラメータを設定してタイムアウト間隔を指定できます。たとえば、初期化パラメータ・ファイルのRESUMABLE_TIMEOUTパラメータを次のように設定することによって、すべてのセッションは、初期状態で再開可能領域割当てが有効になり、タイムアウト間隔が1時間に設定されます。

RESUMABLE_TIMEOUT  = 3600

このパラメータが0(ゼロ)に設定された場合、すべてのセッションに対する再開可能領域割当ては、初期状態で無効になります。これはデフォルトです。

ALTER SYSTEM SET文を使用すると、このパラメータの値をシステム・レベルで変更できます。たとえば、次の文では、すべてのセッションに対して再開可能領域割当てが無効になります。

ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;

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

ALTER SESSIONを使用した再開可能領域割当ての有効化と無効化

次のSQL文を使用して、セッションの再開可能モードを有効化できます。

ALTER SESSION ENABLE RESUMABLE;

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

ALTER SESSION DISABLE RESUMABLE;

RESUMABLE_TIMEOUT初期化パラメータが0(ゼロ)の値に設定されている場合、新しいセッションのデフォルトの再開可能モードは無効です。

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

関連項目:

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

タイムアウト間隔の指定

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

ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;

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

関連項目:

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

再開可能文の命名

再開可能文は、名前で識別するように設定できます。次の文は、再開可能文に名前を割り当てます。

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ビューで再開可能文を識別する際に使用します。

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

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


注意:

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


一時停止文の検出

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

ユーザーへの通知: 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言語リファレンス』を参照してください。 

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

次のビューを問い合せることにより、再開可能文の状態に関する情報を取得できます。

ビュー  説明 

DBA_RESUMABLE

USER_RESUMABLE  

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

V$SESSION_WAIT  

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

関連項目:

これらのビューに含まれる列の詳細は、『Oracle Databaseリファレンス』を参照してください。 

DBMS_RESUMABLEパッケージの使用方法

DBMS_RESUMABLEパッケージは、再開可能領域割当ての管理に役立ちます。次のプロシージャを起動できます。

プロシージャ  説明 

ABORT(sessionID)  

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

Oracle Databaseでは、ABORT操作が常に正常終了することが保証されています。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の単位は秒数です。新しいタイムアウト設定は、即時にセッションに適用されます。 

関連項目:

『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 

操作一時停止アラート

再開可能セッションが一時停止されると、操作を完了するためにリソースを割り当てる必要があるオブジェクトに対して、操作一時停止アラートが発行されます。リソースが割り当てられて操作が完了すると、操作一時停止アラートはクリアされます。 システム生成アラートの詳細は、「表領域のアラートの管理」を参照してください。

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

次の例では、システム全体で有効なAFTER SUSPENDトリガーを作成し、ユーザーSYSとしてデータベース・レベルで登録します。任意のセッションで再開可能文が一時停止すると、このトリガーは次の2つのうちどちらかの処理を実行します。

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

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 via 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;
/

使用できない領域の再生

ここでは、使用できなくなっている領域の再生方法について説明します。また、再生可能な領域が存在しているセグメントを特定するOracle Databaseのコンポーネントであるセグメント・アドバイザについても紹介します。この項の内容は、次のとおりです。

再生可能な未使用領域の理解

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

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

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

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

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

セグメント・アドバイザは、再生可能な領域があるセグメントを特定します。セグメント・アドバイザは、自動ワークロード・リポジトリ(AWR)内の使用統計や増加統計を調査したり、セグメントのデータをサンプリングすることで分析を実行します。セグメント・アドバイザは、メンテナンス・ウィンドウの実行時に自動化メンテナンス・タスクとして実行するように構成されていますが、必要時に(手動で)実行することもできます。セグメント・アドバイザの自動化メンテナンス・タスクを自動セグメント・アドバイザと呼びます。

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

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

セグメント・アドバイザを使用する手順

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

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

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

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

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

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

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

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

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

関連項目:

 

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

セグメント・アドバイザは、Enterprise ManagerまたはPL/SQLパッケージのプロシージャ・コールを使用して、いつでも手動で実行できます。セグメント・アドバイザを手動で実行する理由には、次のものがあります。

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

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

Enterprise Managerを使用した手動によるセグメント・アドバイザの実行

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

いずれの場合も、セグメント・アドバイザのタスクがOracle Databaseのスケジューラのジョブとして作成されます。ジョブは、ただちに実行するようにスケジュールできます。あるいは、スケジューラが提供する高度なスケジューリング機能を活用できます。

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

  1. データベース・ホームページから、「関連リンク」の下の「アドバイザ・セントラル」をクリックします。

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

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

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

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

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

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

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

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


    画像の説明

    関連項目:

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

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

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

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

CREATE_TASK 

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

CREATE_OBJECT 

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

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

select table_name, iot_name, iot_type from dba_tables;
 

SET_TASK_PARAMETER 

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

EXECUTE_TASK 

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

表 17-2    DBMS_ADVISOR.CREATE_OBJECTの入力 
入力パラメータ 
OBJECT_TYPE  ATTR1  ATTR2  ATTR3  ATTR4 

TABLESPACE 

tablespace name 

NULL 

NULL 

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

TABLE 

schema name 

table name 

NULL 

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

INDEX 

schema name 

index name 

NULL 

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

TABLE PARTITION 

schema name 

table name 

table partition name 

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

INDEX PARTITION 

schema name 

index name 

index partition name 

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

TABLE SUBPARTITION 

schema name 

table name 

table subpartition name 

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

INDEX SUBPARTITION 

schema name 

index name 

index subpartition name 

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

LOB 

schema name 

segment name 

NULL 

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

LOB PARTITION 

schema name 

segment name 

lob partition name 

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

LOB SUBPARTITION 

schema name 

segment name 

lob subpartition name 

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

表 17-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; 
/

セグメント・アドバイザの結果の表示

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

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

表 17-4    セグメント・アドバイザの結果の種類 
結果の種類  関連するビュー  説明 

推奨事項 

DBA_ADVISOR_RECOMMENDATIONS 

セグメントの縮小または再編成が効果的な場合は、そのセグメントに対して推奨事項が生成されます。表17-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ビューに、分析した各セグメントごとに1つのエントリが作成されます。表17-2は、このビューの列を示しています。これらの列を使用して、分析されたセグメントの情報を問い合せます。このビューのオブジェクトは、結果、推奨および処置の各ビューにあるオブジェクトに関連付けることができます。 

関連項目:

  • DBA_ADVISOR_*ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

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

 

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

Enterprise Manager(EM)では、自動セグメント・アドバイザの実行とセグメント・アドバイザの手動実行の両方についてセグメント・アドバイザの結果を表示できます。次の種類の結果を表示できます。

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

EMを使用してセグメント・アドバイザの結果を表示する手順(すべての実行)

  1. データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。


    画像の説明

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

    図 17-3    「セグメント・アドバイザ推奨」ページ


    画像の説明

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

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

    図 17-4    「推奨事項の詳細」ページ


    画像の説明

    ヒント:

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

EMを使用してセグメント・アドバイザの結果を表示する手順(自動セグメント・アドバイザの最新の実行)

  1. データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。

    「セグメント・アドバイザ推奨」ページが表示されます。(図17-3を参照してください)。

  2. 「表示」ドロップダウン・リストで、「最後の自動実行からの推奨事項」を選択します。

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

    「推奨事項の詳細」ページが表示されます。(図17-4を参照してください)。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。

EMを使用してセグメント・アドバイザの結果を表示する手順(特定の実行)

  1. 「アドバイザ・セントラル」ページから開始します。

    Enterprise Managerウィザードでセグメント・アドバイザを実行した場合は、セグメント・アドバイザのタスクを発行した後に「アドバイザ・セントラル」ページが表示されます。それ以外の場合は、データベース・ホームページの「関連リンク」の下にある「アドバイザ・セントラル」をクリックして、このページを表示します。

  2. タスクが「結果」ヘッダーの下のリストに表示されていることを確認します。 タスクがない場合は、手順を完了します(図17-2を参照)。

    1. ページの「検索」セクションの「アドバイザ・タスク」の下にある「アドバイザ・タイプ」リストから「セグメント・アドバイザ」を選択します。

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

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

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

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

  3. ジョブのステータスを確認します。ステータスがCOMPLETEDでない場合は、タスク・ステータスにCOMPLETEDが表示されるまで、ページの上部にある「リフレッシュ」ボタンをクリックします(使用しているブラウザのリフレッシュ・アイコンは使用しないでください)。

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

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

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

    「推奨事項の詳細」ページが表示されます。(図17-4を参照してください)。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。

行連鎖の結果を表示する手順

  1. データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。

    「セグメント・アドバイザ推奨」ページが表示されます。(図17-3を参照してください)。

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

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

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

表17-5のヘッダーには、セグメント・アドバイザからの出力が記載されたDBA_ADVISOR_*ビューの列が表示されます。 これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。この表に、考えられる出力の要約を示します。 また、表17-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.

表 17-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パーセントの連鎖行を再編成で削除できます。 

なし 

なし 

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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

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

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

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

Enterprise Managerを使用して自動セグメント・アドバイザのタスクを構成する手順

  1. ユーザーSYSTEMでEnterprise Managerにログインします。

  2. データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」ラベルの横の数値リンクをクリックします。


    画像の説明

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

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

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

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

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


    画像の説明

  5. 自動セグメント・アドバイザを完全に無効化するには、「タスク設定」の下にある「セグメント・アドバイザ」ラベルの横の「無効」を選択して、「適用」をクリックします。

  6. 特定のメンテナンス・ウィンドウの自動セグメント・アドバイザを無効化するには、「セグメント・アドバイザ」列の下の該当するチェック・ボックスの選択を解除し、「適用」をクリックします。

  7. メンテナンス・ウィンドウの開始時間、終了時間および継続時間を変更するには、「ウィンドウ・グループの編集」をクリックします。

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

    関連項目:

     

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

次のビューには、自動セグメント・アドバイザ固有の情報が表示されます。 詳細は、『Oracle Databaseリファレンス』を参照してください。

ビュー  説明 

DBA_AUTO_SEGADV_SUMMARY 

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

DBA_AUTO_SEGADV_CTL 

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

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

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

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

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

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

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

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

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

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


注意:

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


表、索引構成表、索引、パーティション、サブパーティション、マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの領域を縮小できます。この縮小には、SHRINK SPACE句を指定したALTER TABLEALTER INDEXALTER MATERIALIZED VIEW文またはALTER MATERIALIZED VIEW LOG文を使用します。 データベース・オブジェクトを縮小する構文、追加情報および制約は、『Oracle Database SQLリファレンス』を参照してください。

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

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;

関連項目:

LOBセグメントの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。 

未使用領域の割当て解除

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

割当てを解除する前に、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ビューを調べることにより、割当て解除によって解放された領域を確認できます。

関連項目:

  • 未使用領域の割当て解除に関連する構文とセマンティクスの詳細は、『Oracle Database SQLリファレンス』を参照してください。

  • DBA_FREE_SPACEビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

 

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

表またはその他のデータ構造を作成する際には、必要となる領域の大きさを把握しておく必要があります。領域要件は、データ型ごとに異なります。 データ型とその領域要件の詳細は、『Oracle Database PL/SQL言語リファレンス』および『Oracle Database SQLリファレンス』を参照してください。

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

Oracle Databaseには、スキーマ・オブジェクトの領域使用に関する情報を表示するためのデータ・ディクショナリ・ビューとPL/SQLパッケージが用意されています。特定のスキーマ・オブジェクトに固有のビューとパッケージは、このマニュアルの各オブジェクトに関連した章に記載されています。ここでは、汎用的な性質を持ち、複数のスキーマ・オブジェクトに適用されるビューとパッケージについて説明します。

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

オラクル社が提供するPL/SQLパッケージを使用すると、スキーマ・オブジェクトに関する次の情報を取得できます。

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

DBMS_SPACE.UNUSED_SPACE 

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

DBMS_SPACE.FREE_BLOCKS 

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

DBMS_SPACE.SPACE_USAGE 

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

関連項目:

PL/SQLパッケージの詳細は、『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

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

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

ビュー  説明 

DBA_SEGMENTS

USER_SEGMENTS  

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

DBA_EXTENTS

USER_EXTENTS  

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

DBA_FREE_SPACE

USER_FREE_SPACE  

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

次に、これらのビューの使用例を示します。

関連項目:

データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。 

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

次の問合せは、スキーマ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.

例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スキーマには、複数のエクステントが割り当てられているセグメントはありません。

例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.

例4: 追加のエクステントを割り当てることができないセグメントの表示

セグメントは、次のいずれかの理由でエクステントを割り当てることができない場合があります。

次の問合せは、これらの基準のいずれかを満たすすべてのセグメントの名前、所有者および表領域を返します。

SELECT a.SEGMENT_NAME, a.SEGMENT_TYPE, a.TABLESPACE_NAME, a.OWNER 
    FROM DBA_SEGMENTS a
    WHERE a.NEXT_EXTENT >= (SELECT MAX(b.BYTES)
        FROM DBA_FREE_SPACE b
        WHERE b.TABLESPACE_NAME = a.TABLESPACE_NAME)
    OR a.EXTENTS = a.MAX_EXTENTS
    OR a.EXTENTS = 'data_block_size' ;


注意:

この問合せを使用するときは、data_block_sizeをシステムのデータ・ブロック・サイズに置き換えてください。 


追加のエクステントを割り当てることのできないセグメントを識別した後、その原因に応じて、次のどちらかの方法で問題を解決できます。

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

Oracle Databaseには、データベース・オブジェクトの容量を計画する方法が2つあります。

ここでは、PL/SQLによる方法について説明します。 Enterprise Managerを使用した容量計画の詳細は、Enterprise Managerのオンライン・ヘルプおよび『Oracle Database 2日でデータベース管理者』を参照してください。

DBMS_SPACEパッケージには、新しいオブジェクトのサイズを予測したり、既存のデータベース・オブジェクトのサイズを監視できる3つのプロシージャがあります。ここでは、これらのプロシージャについて説明します。この項の内容は、次のとおりです。

表の領域使用の見積り

データベース表のサイズは、表領域の記憶域属性、表領域のブロック・サイズ、他の様々な要因によって大きく変化する可能性があります。DBMS_SPACEパッケージのCREATE_TABLE_COSTプロシージャを使用すると、表を作成する際の領域使用コストを予測できます。 このプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

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

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

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

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

索引の領域使用の見積り

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

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

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

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

DBMS_SPACEパッケージのOBJECT_GROWTH_TRENDプロシージャを使用すると、1行以上の表が作成されます。各行には、特定の時点でのオブジェクトの領域使用が表示されます。このプロシージャは、自動ワークロード・リポジトリから領域使用合計を取得、または現在の領域使用を計算し、その値を自動ワークロード・リポジトリから取得したこれまでの領域使用の変化と結び付けます。このプロシージャのパラメータの詳細は、『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

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

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


戻る 次へ
Oracle
Copyright © 2001, 2008, Oracle Corporation.
All Rights Reserved.
目次
目次
索引
索引