Oracle Database 管理者ガイド 11gリリース1(11.1) E05760-03 |
|
この章の内容は次のとおりです。
Oracle Databaseでは、使用可能な領域が少なくなると事前にアラートで通知されるため、表領域のディスク領域を管理するのに役立ちます。デフォルトで、警告およびクリティカルの2つのアラートしきい値が定義されています。警告のしきい値は、領域が残り少なくなり始める境界値です。クリティカルのしきい値は、即時に注意を喚起する必要のある深刻な境界値です。データベースは、両方のしきい値でアラートを発行します。
ローカル管理表領域とディクショナリ管理表領域の両方に対してアラートしきい値を指定するには、次の2つの方法があります。
警告のしきい値とクリティカルのしきい値の両方について、使用済領域が合計領域の一定割合以上になるとアラートが発行されます。
警告のしきい値とクリティカルのしきい値の両方について、空き領域が一定容量(KB)未満になるとアラートが発行されます。空き領域のしきい値は、表領域が大規模な場合に便利です。
ローカル管理表領域のアラートはサーバーで生成されます。ディクショナリ管理表領域の場合は、Enterprise Managerがこの機能を提供します。 詳細は、「サーバー生成アラートを使用したデータベースの動作の監視」を参照してください。
新しい表領域には、次のようにアラートしきい値が割り当てられます。
各表領域には、パーセント・フルのしきい値のみ、空き領域のしきい値のみ、または同時に両方のしきい値タイプを設定できます。どちらのタイプのしきい値も、0(ゼロ)に設定すると無効になります。
理想的な警告のしきい値は、クリティカルのしきい値が発行される前に問題を解決できる時間を考慮して、早めにアラートを発行する設定です。クリティカルのしきい値は、ただちに処理してサービスの損失を回避できるよう十分早めにアラートを発行するように設定します。
アラートしきい値の設定方法
DBMS_SERVER_ALERT.SET_THRESHOLD
パッケージ・プロシージャ(使用方法の詳細は『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照)を使用します。
次の例は、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; /
ローカル管理表領域のアラートしきい値に明示的に値を設定した後は、その値をDBMS_SERVER_ALERT.SET_THRESHOLD
を使用してNULL
に設定することで、データベースのデフォルト値に戻すことができます。
ローカル管理表領域のデータベース・デフォルトしきい値を変更するには、前述の例のようにDBMS_SERVER_ALERT.SET_THRESHOLD
を起動します。ただし、この場合は、object_name
をNULL
に設定します。データベース・デフォルトを使用する表領域はすべて新しいデフォルトに切り替わります。
アラートを表示するには、Enterprise Manager Database Controlのホームページにアクセスします。
ローカル管理表領域のアラートは、DBA_OUTSTANDING_ALERTS
ビューを使用して表示することもできます。 詳細は、「サーバー生成アラートのデータ・ディクショナリ・ビュー」を参照してください。
しきい値ベースのアラートには、次の制限があります。
関連項目:
DBMS_SERVER_ALERT
パッケージのプロシージャとその使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
Oracle Databaseでは、領域割当てが失敗した場合に大規模なデータベース処理を一時停止して、後で再開するための方法が提供されています。これにより、Oracle Databaseサーバーがユーザーにエラーを返すかわりに対処措置を講じることができます。エラー条件が訂正されると、一時停止していた処理が自動的に再開します。この機能のことを、再開可能領域割当てと呼びます。また、影響を受ける文のことを、再開可能文と呼びます。
この項の内容は、次のとおりです。
ここでは、再開可能領域割当ての概要について説明します。再開可能領域割当ての動作について説明し、修飾文とエラー条件を具体的に定義します。
再開可能領域割当ての動作の概要は、次のとおりです。詳細はこの後の各項で説明します。
DBMS_RESUMABLE.ABORT()
プロシージャを使用して、強制的に例外を発生できます。このプロシージャは、DBAまたは文を発行したユーザーがコールできます。
再開可能な操作は、次のとおりです。
一時領域(ソート領域)を使い果たしたSELECT
文は、再開可能な実行の候補になります。Oracle Call Interface(OCI)の使用時は、OCIStmtExecute()
およびOCIStmtFetch()
の各コールが候補になります。
INSERT
、UPDATE
およびDELETE
の各文が候補になります。各文の実行に使用されているインタフェースには関係ありません。OCI、SQLJ、PL/SQLやその他のインタフェースでも有効です。外部表からのINSERT INTO...SELECT
も再開可能にできます。
SQL*Loaderについては、リカバリ可能なエラーの後に文が再開可能かどうかをコマンドライン・パラメータで制御します。
次の文が、再開可能な実行の候補になります。
訂正可能なエラーには、次の3つのクラスがあります。
データベースの操作によって、表領域内の表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション用のエクステントをこれ以上取得できません。たとえば、次のエラーはこのカテゴリに属します。
ORA-1653 unable to extend table ... in tablespace ... ORA-1654 unable to extend index ... in tablespace ...
表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション内のエクステント数が、オブジェクトで定義されている最大エクステント数に等しくなりました。たとえば、次のエラーはこのカテゴリに属します。
ORA-1631 max # extents ... reached in table ... ORA-1654 max # extents ... reached in index ...
ユーザーが自分に割り当てられている表領域内のスペース割当制限を超過しました。具体的には、次のエラーによって示されます。
ORA-1536 space quote exceeded for tablespace string
分散環境で、ユーザーが再開可能領域割当てを有効または無効にした場合、またはDBAとしてRESUMABLE_TIMEOUT
初期化パラメータを変更した場合、その影響を受けるのはローカルのインスタンスのみです。分散トランザクションで、セッションまたはリモート・インスタンスが一時停止されるのは、RESUMABLE
がリモート・インスタンスで有効な場合のみです。
パラレル実行では、パラレル実行サーバー・プロセスの1つで訂正可能なエラーが発生した場合、そのサーバー・プロセスの実行が一時停止します。他のパラレル実行サーバー・プロセスでは、エラーが発生するまで、または一時停止したサーバー・プロセスに(直接または間接に)ブロックされるまで、個々のタスクの実行が継続されます。訂正可能なエラーが解決すると、一時停止したプロセスが実行を再開し、パラレル操作の実行は継続されます。一時停止したプロセスが終了した場合、パラレル操作は中断し、ユーザーに対してエラーが返されます。
異なるパラレル実行プロセスで、1つ以上の訂正可能なエラーが発生することがあります。この結果、AFTER SUSPEND
トリガーが複数回、パラレルに発行される場合があります。また、あるパラレル実行サーバー・プロセスが一時停止中に他のパラレル実行サーバー・プロセスで訂正不可能なエラーが発生すると、一時停止していた文はただちに強制終了します。
パラレル実行については、すべてのパラレル実行コーディネータとサーバー・プロセスがDBA_RESUMABLE
またはUSER_RESUMABLE
ビューに独自のエントリを持っています。
再開可能領域割当ては、再開可能モードを有効にしたセッションの中で文を実行するときのみ可能です。再開可能領域割当ての有効化と無効化には2通りの方法があります。再開可能領域割当ては、RESUMABLE_TIMEOUT
初期化パラメータを使用してシステム・レベルで制御するか、またはALTER SESSION
文の句を使用してセッション・レベルで有効化できます。
再開可能領域割当てをシステム全体で有効化し、RESUMABLE_TIMEOUT
初期化パラメータを設定してタイムアウト間隔を指定できます。たとえば、初期化パラメータ・ファイルのRESUMABLE_TIMEOUT
パラメータを次のように設定することによって、すべてのセッションは、初期状態で再開可能領域割当てが有効になり、タイムアウト間隔が1時間に設定されます。
RESUMABLE_TIMEOUT = 3600
このパラメータが0(ゼロ)に設定された場合、すべてのセッションに対する再開可能領域割当ては、初期状態で無効になります。これはデフォルトです。
ALTER SYSTEM SET
文を使用すると、このパラメータの値をシステム・レベルで変更できます。たとえば、次の文では、すべてのセッションに対して再開可能領域割当てが無効になります。
ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;
セッション内で、ユーザーはALTER SESSION SET
文を発行してRESUMABLE_TIMEOUT
初期化パラメータを設定し、再開可能領域割当てを有効にしてタイムアウト値を変更するか、または再開可能モードを無効にできます。
次のSQL文を使用して、セッションの再開可能モードを有効化できます。
ALTER SESSION ENABLE RESUMABLE;
再開可能モードを無効化するには、次の文を使用します。
ALTER SESSION DISABLE RESUMABLE;
RESUMABLE_TIMEOUT
初期化パラメータが0(ゼロ)の値に設定されている場合、新しいセッションのデフォルトの再開可能モードは無効です。
タイムアウト間隔や、再開可能文の識別に使用する名前も指定できます。次の項では、各操作について説明します。
介入操作が発生しなかった場合に一時停止した文がエラーとなるタイムアウト間隔は、再開可能モードを有効化するときに指定できます。次の文は、再開可能トランザクションが3600秒後にタイムアウトし、エラーになることを指定します。
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;
TIMEOUT
の値は、別のALTER SESSION ENABLE RESUMABLE
文や他の手段によって変更されるまで、またはセッションが終了するまで有効です。ENABLE RESUMABLE TIMEOUT
句を使用して再開可能モードを有効化する場合、デフォルトのタイムアウト間隔は7200秒です。
再開可能文は、名前で識別するように設定できます。次の文は、再開可能文に名前を割り当てます。
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
ビューで再開可能文を識別する際に使用します。
RESUMABLE_TIMEOUT
初期化パラメータを設定する以外に、デフォルトの再開可能モードを設定するもう1つの方法は、データベース・レベルのLOGON
トリガーを登録して、再開可能を有効化してタイムアウト間隔を設定するように、ユーザーのセッションを変更する方法です。
再開可能文が一時停止するとき、クライアントにはエラーは通知されません。訂正処理を実行するため、Oracle Databaseではユーザーにエラーを通知して状況に関する情報を提供するかわりの手段が提供されています。
再開可能文で訂正可能なエラーが発生すると、システムは内部的に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;
次のビューを問い合せることにより、再開可能文の状態に関する情報を取得できます。
DBMS_RESUMABLE
パッケージは、再開可能領域割当ての管理に役立ちます。次のプロシージャを起動できます。
再開可能セッションが一時停止されると、操作を完了するためにリソースを割り当てる必要があるオブジェクトに対して、操作一時停止アラートが発行されます。リソースが割り当てられて操作が完了すると、操作一時停止アラートはクリアされます。 システム生成アラートの詳細は、「表領域のアラートの管理」を参照してください。
次の例では、システム全体で有効な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)内の使用統計や増加統計を調査したり、セグメントのデータをサンプリングすることで分析を実行します。セグメント・アドバイザは、メンテナンス・ウィンドウの実行時に自動化メンテナンス・タスクとして実行するように構成されていますが、必要時に(手動で)実行することもできます。セグメント・アドバイザの自動化メンテナンス・タスクを自動セグメント・アドバイザと呼びます。
セグメント・アドバイザは、次の種類のアドバイスを生成します。
領域管理のアラートを受け取った場合、または領域の再生を決定した場合は、セグメント・アドバイザを開始してください。
セグメント・アドバイザを使用する手順
自動セグメント・アドバイザを理解するには、この後の「自動セグメント・アドバイザ」を参照してください。 結果の表示方法の詳細は、「セグメント・アドバイザの結果の表示」を参照してください。
この後の「手動によるセグメント・アドバイザの実行」を参照してください。
自動セグメント・アドバイザは、すべてのメンテナンス・ウィンドウ内で実行するように構成されている自動化メンテナンス・タスクです。
自動セグメント・アドバイザは、すべてのデータベース・オブジェクトを分析するわけではありません。かわりに、データベース統計を調査し、セグメント・データをサンプリングした後、次のような分析対象オブジェクトを選択します。
分析対象オブジェクトが選択されても、セグメント・アドバイザがオブジェクトを処理する前にメンテナンス・ウィンドウが終了する場合、そのオブジェクトは、自動セグメント・アドバイザの次回の実行に組み込まれます。
自動セグメント・アドバイザによって分析対象として選択された表領域とセグメントのセットは変更できません。ただし、自動セグメント・アドバイザのタスクの有効化または無効化、自動セグメント・アドバイザの実行予定回数、または自動化メンテナンス・タスクのシステム・リソース使用率は変更できます。 詳細は、「自動セグメント・アドバイザの構成」を参照してください。
セグメント・アドバイザは、Enterprise ManagerまたはPL/SQLパッケージのプロシージャ・コールを使用して、いつでも手動で実行できます。セグメント・アドバイザを手動で実行する理由には、次のものがあります。
セグメント・アドバイザには、3種類のレベルでアドバイスを要求できます。
表17-2にあるOBJECT_TYPE
列は、アドバイスを要求できるオブジェクトのタイプを示しています。
Enterprise Managerを使用してセグメント・アドバイザを手動で実行するには、OEM_ADVISOR
ロールが付与されている必要があります。セグメント・アドバイザを実行するには、次の2つの方法があります。
この方法を使用すると、表領域レベルまたはオブジェクト・レベルでアドバイスを要求できます。オブジェクト・レベルでは、表、索引、表パーティションおよび索引パーティションについてアドバイスを要求できます。LOBセグメントなどの依存オブジェクトは、分析の対象にはなりません。
たとえば、(「スキーマ」ページからアクセス可能な)「表」ページに表のリストを表示する場合は、表を選択して「アクション」メニューから「セグメント・アドバイザの実行」コマンドを選択します。
この方法では、スキーマ・オブジェクトの依存オブジェクトをセグメント・アドバイザの実行対象に含めることができます。たとえば、表を選択して「セグメント・アドバイザの実行」コマンドを選択すると、パーティション、索引セグメント、LOBセグメントなど、表の依存オブジェクトが表示されます。依存オブジェクトを選択することで、そのオブジェクトを実行対象に指定できます。
いずれの場合も、セグメント・アドバイザのタスクがOracle Databaseのスケジューラのジョブとして作成されます。ジョブは、ただちに実行するようにスケジュールできます。あるいは、スケジューラが提供する高度なスケジューリング機能を活用できます。
セグメント・アドバイザ・ウィザードを使用してセグメント・アドバイザを手動で実行する手順
「アドバイザ・セントラル」ページが表示されます(図17-2を参照してください)。
セグメント・アドバイザ・ウィザードの最初のページが表示されます。
「アドバイザ・セントラル」ページが再度表示され、「結果」ヘッダー下のリスト上部にセグメント・アドバイザの新しいジョブが表示されます。ジョブ・ステータスはSCHEDULED
またはRUNNING
となります(ジョブが表示されない場合は、リスト上部の検索フィールドを使用して表示します)。
COMPLETED
でない場合は、ページの上部にある「リフレッシュ」ボタンを繰り返しクリックします(使用しているブラウザのリフレッシュ・アイコンは使用しないでください)。ジョブ・ステータスがCOMPLETED
に変わった場合は、「選択」列をクリックしてジョブを選択し、「結果の表示」をクリックします。
セグメント・アドバイザは、DBMS_ADVISOR
パッケージを使用して実行することもできます。パッケージ・プロシージャを使用してセグメント・アドバイザのタスクを作成し、タスクの引数を設定してからタスクを実行します。ADVISOR
権限が付与されている必要があります。表17-1に、セグメント・アドバイザに関連するプロシージャを示します。 これらのプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
パッケージ・プロシージャ名 | 説明 |
---|---|
|
このプロシージャを使用して、セグメント・アドバイザのタスクを作成します。 |
|
このプロシージャを使用して、セグメント領域のアドバイス対象オブジェクトを識別します。このプロシージャのパラメータ値は、オブジェクトの種類によって異なります。表17-2に、パラメータ値をオブジェクトの種類別に示します。
注意: IOTオーバーフロー・セグメントについてアドバイスを要求するには、 select table_name, iot_name, iot_type from dba_tables; |
|
このプロシージャを使用して、必要なセグメント・アドバイスを指定します。表17-3に、このプロシージャに関係する入力パラメータを示します。リストされていないパラメータは、セグメント・アドバイザでは使用されません。 |
|
このプロシージャを使用して、セグメント・アドバイザのタスクを実行します。 |
次の例は、DBMS_ADVISOR
プロシージャを使用して、サンプル表hr.employees
に対してセグメント・アドバイザを実行する方法を示しています。これらのパッケージ・プロシージャを実行するユーザーには、そのパッケージに対するオブジェクトのEXECUTE
権限、またはADVISOR
システム権限が必要です。
オブジェクト型TABLE
をDBMS_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-5に、生成される結果および推奨事項の例を示します。 |
結果 |
|
これは、分析したセグメントに関するレポートです。結果には、分析対象の各セグメントの使用済領域と空き領域の統計が含まれます。すべての結果が推奨事項になるわけではありません(推奨事項はわずかでも生成される結果は多い場合があります)。PL/SQLを使用してセグメント・アドバイザを手動で実行する場合は、 |
処置 |
|
すべての推奨事項は、セグメントの縮小またはオンライン再定義(再編成)の実施を提案する処置に関連付けられます。 |
オブジェクト |
|
結果、推奨事項および処置はすべて1つのオブジェクトに関連付けられます。セグメント・アドバイザが複数のセグメントを分析した場合は、表領域またはパーティション表と同様に、 |
Enterprise Manager(EM)では、自動セグメント・アドバイザの実行とセグメント・アドバイザの手動実行の両方についてセグメント・アドバイザの結果を表示できます。次の種類の結果を表示できます。
自動セグメント・アドバイザの最新の実行で分析されたセグメントを一覧に表示することもできます。
EMを使用してセグメント・アドバイザの結果を表示する手順(すべての実行)
「セグメント・アドバイザ推奨」ページが表示されます。推奨事項は、表領域別に編成されます。
「推奨事項の詳細」ページが表示されます。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
EMを使用してセグメント・アドバイザの結果を表示する手順(自動セグメント・アドバイザの最新の実行)
「セグメント・アドバイザ推奨」ページが表示されます。(図17-3を参照してください)。
「推奨事項の詳細」ページが表示されます。(図17-4を参照してください)。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
EMを使用してセグメント・アドバイザの結果を表示する手順(特定の実行)
Enterprise Managerウィザードでセグメント・アドバイザを実行した場合は、セグメント・アドバイザのタスクを発行した後に「アドバイザ・セントラル」ページが表示されます。それ以外の場合は、データベース・ホームページの「関連リンク」の下にある「アドバイザ・セントラル」をクリックして、このページを表示します。
COMPLETED
でない場合は、タスク・ステータスにCOMPLETED
が表示されるまで、ページの上部にある「リフレッシュ」ボタンをクリックします(使用しているブラウザのリフレッシュ・アイコンは使用しないでください)。
セグメント・アドバイザのタスクのページに、表領域別に編成された推奨事項が表示されます。
「推奨事項の詳細」ページが表示されます。(図17-4を参照してください)。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
行連鎖の結果を表示する手順
「セグメント・アドバイザ推奨」ページが表示されます。(図17-3を参照してください)。
「行チェーン分析」ページには、連鎖行があるすべてのセグメントと各連鎖行の割合が表示されます。
表17-5のヘッダーには、セグメント・アドバイザからの出力が記載されたDBA_ADVISOR_*
ビューの列が表示されます。 これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。この表に、考えられる出力の要約を示します。 また、表17-2に、分析したセグメントの情報が格納されるDBA_ADVISOR_OBJECTS
ビューの列を示します。
DBA_ADVISOR_*
ビューを問い合せる前に、DBA_ADVISOR_TASKS
のSTATUS
列を問い合せることで、セグメント・アドバイザのタスクが完了していることを確認できます。
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.
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を使用して自動セグメント・アドバイザのタスクを構成する手順
SYSTEM
でEnterprise Managerにログインします。
「セグメント・アドバイザ推奨」ページが表示されます。
「自動化メンテナンス・タスク」ページが表示されます
「自動化メンテナンス・タスク構成」ページが表示されます。
「ウィンドウ・グループの編集」ページが表示されます。メンテナンス・ウィンドウの名前をクリックして「編集」をクリックし、ウィンドウのスケジュールを変更します。
次のビューには、自動セグメント・アドバイザ固有の情報が表示されます。 詳細は、『Oracle Databaseリファレンス』を参照してください。
Oracle Databaseセグメントの最高水位標の下の断片化された空き領域を再生するには、オンラインによるセグメントの縮小を使用します。セグメントの縮小の利点は、次のとおりです。
セグメントの縮小は、オンラインで適切に機能する操作です。セグメント縮小のデータ移動フェーズでは、DML操作および問合せを発行できます。縮小操作の最後に領域が割当て解除される際は、短い時間ですが同時DML操作がブロックされます。索引は、縮小操作中も保持され、操作が完了した後も使用できます。セグメントの縮小では、余分なディスク領域の割当ては不要です。
セグメントの縮小では、最高水位標の上下両方の未使用領域を再生します。これに対して、領域の割当て解除では、最高水位標よりも上の未使用領域のみを再生します。縮小操作では、デフォルトの場合、セグメントを縮小して最高水位標を調整し、回復した領域が解放されます。
セグメントの縮小には、新しい位置への行の移動が必要です。したがって、最初に、縮小するオブジェクトの行を移動可能にし、オブジェクトに定義したROWIDベースのトリガーを無効にする必要があります。表内の行を移動可能にするには、ALTER
TABLE
...ENABLE
ROW
MOVEMENT
コマンドを使用します。
縮小操作は、自動セグメント領域管理(ASSM)を使用しているローカル管理表領域内のセグメントに対してのみ実行できます。ASSM表領域内では、次の表を除くすべてのセグメント・タイプがオンラインによるセグメントの縮小に適しています。
オンラインによるセグメントの縮小を起動する前に、セグメント・アドバイザの結果および推奨事項を表示します。 詳細は、「セグメント・アドバイザの使用」を参照してください。
Enterprise Manager(EM)またはSQL*PlusのSQLコマンドを使用して、オンラインによるセグメントの縮小を起動します。ここからは、コマンドラインによる方法について説明します。
表、索引構成表、索引、パーティション、サブパーティション、マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの領域を縮小できます。この縮小には、SHRINK SPACE
句を指定したALTER
TABLE
、ALTER
INDEX
、ALTER
MATERIALIZED
VIEW
文またはALTER
MATERIALIZED
VIEW
LOG
文を使用します。 データベース・オブジェクトを縮小する構文、追加情報および制約は、『Oracle Database SQLリファレンス』を参照してください。
次の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;
未使用領域の割当てを解除する場合は、未使用の(最高水位標)データベース・セグメントの最後で未使用領域を解放して、表領域の他のセグメントで領域を使用できるようにします。
割当てを解除する前に、DBMS_SPACE
パッケージのUNUSED_SPACE
プロシージャを実行できます。このプロシージャは、最高水位標の位置とセグメント内の未使用領域の量についての情報を返します。自動セグメント領域管理を使用しているローカル管理表領域のセグメントでは、SPACE_USAGE
プロシージャを使用すると、未使用領域に関する正確な情報を取得できます。
次の文は、セグメント(表、索引またはクラスタ)内の未使用領域の割当てを解除します。
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 PL/SQL言語リファレンス』および『Oracle Database SQLリファレンス』を参照してください。
Oracle Databaseには、スキーマ・オブジェクトの領域使用に関する情報を表示するためのデータ・ディクショナリ・ビューとPL/SQLパッケージが用意されています。特定のスキーマ・オブジェクトに固有のビューとパッケージは、このマニュアルの各オブジェクトに関連した章に記載されています。ここでは、汎用的な性質を持ち、複数のスキーマ・オブジェクトに適用されるビューとパッケージについて説明します。
オラクル社が提供するPL/SQLパッケージを使用すると、スキーマ・オブジェクトに関する次の情報を取得できます。
次の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
次のビューには、スキーマ・オブジェクトの領域使用に関する情報が表示されます。
次に、これらのビューの使用例を示します。
次の問合せは、スキーマ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.
データベース内に現在割り当てられているエクステントに関する情報は、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
スキーマには、複数のエクステントが割り当てられているセグメントはありません。
データベース内の使用可能エクステント(どのセグメントにも割り当てられていないエクステント)に関する情報は、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.
セグメントは、次のいずれかの理由でエクステントを割り当てることができない場合があります。
次の問合せは、これらの基準のいずれかを満たすすべてのセグメントの名前、所有者および表領域を返します。
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' ;
追加のエクステントを割り当てることのできないセグメントを識別した後、その原因に応じて、次のどちらかの方法で問題を解決できます。
MAXEXTENTS
を増やせない場合は、次の手順を実行します。
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の異形は、列情報を使用して表のサイズを見積ります。両方の異形ともに入力として次の値が必要です。
TABLESPACE_NAME
: オブジェクトが作成される表領域。デフォルトはSYSTEM
表領域です。
ROW_COUNT
: 表の予測行数。
PCT_FREE
: 更新の結果、既存の行を将来拡張するように各ブロックに確保する空き領域の割合(パーセンテージ)。
さらに、第1の異形には、AVG_ROW_SIZE
の値も入力する必要があります。値は、予測された行サイズの平均をバイト単位で指定します。
また、第2の異形には、予想された各列値をCOLINFOS
に指定する必要があります。この値は、属性COL_TYPE
(列のデータ型)とCOL_SIZE
(列の文字数またはバイト数)からなるオブジェクト型です。
このプロシージャでは、2つの値が戻ります。
USED_BYTES
: ブロック・メタデータ、PCT_FREE
領域などのオーバーヘッドを含め、データとして使用される実際のバイト数。
ALLOC_BYTES
: 表領域のエクステントの特性を考慮してオブジェクトに割り当てられる予測した領域の大きさ。
DBMS_SPACE
パッケージのCREATE_INDEX_COST
プロシージャを使用すると、既存の表に索引を作成する際の領域使用コストを予測できます。
プロシージャには次の値を入力する必要があります。
DDL
: 索引を作成するCREATE INDEX
文。このDDL文に指定する表は、既存の表であることが必要です。
PLAN_TABLE
(オプション): 使用するPLAN TABLEの名前。デフォルトはNULL
です。
このプロシージャから戻る結果は、セグメントに対して収集された統計によって異なります。したがって、このプロシージャを実行する直前に必ず統計を取得してください。最近の統計がない状態でもエラーになりませんが、不適切な結果が戻る可能性があります。このプロシージャでは、次の値が戻ります。
DBMS_SPACE
パッケージのOBJECT_GROWTH_TREND
プロシージャを使用すると、1行以上の表が作成されます。各行には、特定の時点でのオブジェクトの領域使用が表示されます。このプロシージャは、自動ワークロード・リポジトリから領域使用合計を取得、または現在の領域使用を計算し、その値を自動ワークロード・リポジトリから取得したこれまでの領域使用の変化と結び付けます。このプロシージャのパラメータの詳細は、『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環境では、統計の記録ルールによって、どのオブジェクトが選択されるかを各インスタンスが独自に選択できるようになっています。
このプロシージャから戻る出力は、RAC環境のすべてのインスタンスについて記録した値の集合です。各値は、GOOD
およびINTERPOLATED
値の組合せから計算できます。その値の少なくとも80%がGOOD
のインスタンス値から導出された場合、戻される集計値はGOOD
にマークされます。