サービスを使用することで、より効果的なパフォーマンスのチューニングを行うことができます。サービスによって、ワークロードを認識して測定できるため、リソース使用量および待機時間をアプリケーションの属性として指定できます。すべてのセッションが匿名で共有されている多くのシステムでは、セッションおよびSQLを使用したチューニングのかわりに、サービスおよびSQLを使用したチューニングを実行します。
AWRでは、データベースで実行されているすべてのサービスと作業の応答時間、スループット、リソース使用量および待機イベントの情報など、パフォーマンス統計が保持されます。また、サービスのメトリック、統計、待機イベント、待機クラスおよびSQLレベルのトレースも保持されます。さらに、オプションとして、特定の統計を監視するためのモジュールをアプリケーションで定義して、これらの統計をカスタマイズできます。また、このモジュール内に、重要なビジネス・トランザクションで特定の統計値に応答して実行されるアクションを定義することもできます。
モジュールおよびアクションの監視を有効にするには、DBMS_MONITOR
PL/SQLパッケージを使用します。たとえば、erp
サービスを使用する接続の場合、次のコマンドを使用すると、payroll
モジュールのexceptions pay
アクションを監視できます。
EXECUTE DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME => 'ERP', MODULE_NAME=> 'PAYROLL', ACTION_NAME => 'EXCEPTIONS PAY');
erp
サービスを使用する接続の場合、次のコマンドを使用すると、payroll
モジュールのすべてのアクションを監視できます。
EXECUTE DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME => 'ERP', MODULE_NAME=> 'PAYROLL', ACTION_NAME => NULL);
アプリケーション・モジュールとアクションの監視が有効化されたことを確認するには、DBA_ENABLED_AGGREGATIONS
ビューを使用します。
サービスによる統計の収集およびトレースは、Oracle RACデータベース全体を対象とします。また、Oracle RACデータベースと非クラスタのOracle Databaseのどちらの場合も、インスタンスの再起動やサービスの再配置が行われても統計の集計は失われません。
サービス名、モジュール名およびアクション名は、V$SESSION
、V$ACTIVE_SESSION_HISTORY
およびV$SQL
ビューで確認できます。コール回数およびパフォーマンス統計は、V$SERVICE_STATS
、V$SERVICE_EVENT
、V$SERVICE_WAIT_CLASS
、V$SERVICEMETRIC
およびV$SERVICEMETRIC_HISTORY
で確認できます。重要なトランザクションで統計の収集を有効にしている場合、V$SERV_MOD_ACT_STATS
ビューを使用すると、各データベース・インスタンスのそれぞれのサービス名、モジュール名およびアクション名に対して、コール速度を確認できます。
SQL*Plusスクリプトの次のサンプルを実行すると、5秒間隔でサービス品質の統計が収集されます。これらのサービス品質の統計を使用して、サービスの品質を監視したり、作業を割り当てたり、サービスをOracle RAC全体のインスタンス間で均等に分散できます。
SET PAGESIZE 60 COLSEP '|' NUMWIDTH 8 LINESIZE 132 VERIFY OFF FEEDBACK OFF COLUMN service_name FORMAT A20 TRUNCATED HEADING 'Service' COLUMN begin_time HEADING 'Begin Time' FORMAT A10 COLUMN end_time HEADING 'End Time' FORMAT A10 COLUMN instance_name HEADING 'Instance' FORMAT A10 COLUMN service_time HEADING 'Service Time|mSec/Call' FORMAT 999999999 COLUMN throughput HEADING 'Calls/sec'FORMAT 99.99 BREAK ON service_name SKIP 1 SELECT service_name , TO_CHAR(begin_time, 'HH:MI:SS') begin_time , TO_CHAR(end_time, 'HH:MI:SS') end_time , instance_name , elapsedpercall service_time , callspersec throughput FROM gv$instance i , gv$active_services s , gv$servicemetric m WHERE s.inst_id = m.inst_id AND s.name_hash = m.service_name_hash AND i.inst_id = m.inst_id AND m.group_id = 10 ORDER BY service_name , i.inst_id , begin_time ;