ヘッダーをスキップ
Oracle® Database VLDBおよびパーティショニング・ガイド
11g リリース2 (11.2)
B56316-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

パラレル実行のパフォーマンスの監視

パラレル実行のパフォーマンスに関する問題を診断するときは、次の種類の監視を行う必要があります。

動的パフォーマンス・ビューを使用したパラレル実行パフォーマンスの監視

Oracle Databaseのリアルタイム監視機能を使用すると、SQL文の実行中にパフォーマンスを監視することができます。SQLの監視が自動的に開始するのは、SQL文がパラレルで実行されたとき、または1回の実行でCPUまたはI/O時間を5秒以上消費したときです。詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

システムが数日間稼働した後、パラレル実行パフォーマンスの統計を監視して、パラレル処理が最適かどうかを判別する必要があります。これには、ここで説明するいずれかのビューを使用します。

Oracle Real Application Clustersでは、ここで説明するビューのグローバル・バージョンによって、複数インスタンスの統計が集計されます。グローバル・ビューの名前はGで開始します。たとえば、V$FILESTATに対してはGV$FILESTATとなります。

V$PX_BUFFER_ADVICE

V$PX_BUFFER_ADVICEビューは、すべてのパラレル問合せによる最大バッファ使用量の履歴と見積りに関する統計を示します。このビューを調べて、パラレル問合せのメモリー不足の問題に応じてSGAサイズを再構成できます。

V$PX_SESSION

V$PX_SESSIONビューは、問合せサーバーのセッション、グループ、セットおよびサーバー数のデータを示します。パラレル実行のために稼働しているプロセスのリアルタイム・データも示します。この表には、リクエストされた並列度(DOP)と操作に与えられた実際のDOPの情報も含まれます。

V$PX_SESSTAT

V$PX_SESSTATビューは、V$PX_SESSION表とV$SESSTAT表のセッション情報を結合したものです。つまり、通常のセッションで得られるすべてのセッション統計は、パラレル実行を使用して実行されるすべてのセッションでも利用できます。

V$PX_PROCESS

V$PX_PROCESSビューには、パラレル・プロセスの情報が含まれます。ステータス、セッションID、プロセスID、その他の情報があります。

V$PX_PROCESS_SYSSTAT

V$PX_PROCESS_SYSSTATビューは、問合せサーバーのステータスとバッファ割当て統計を示します。

V$PQ_SESSTAT

V$PQ_SESSTATビューは、システムの現在のサーバー・グループすべてのステータスを示します。問合せによってどのようにプロセスが割り当てられたか、またマルチユーザー問合せ調整アルゴリズムやロード・バランシング・アルゴリズムにより、デフォルト値やヒント指定された値がどのように影響されたかといったデータが含まれます。

場合によっては、これらのビューのデータを確認した後で、パフォーマンスを改善するために一部のパラメータの設定を調整する必要があります。その場合は、「パラレル実行のための一般的なパラメータのチューニング」の説明を参照してください。実行時間の長いパラレル操作の進捗を監視するには、これらのビューを定期的に問い合せます。

多くの動的パフォーマンス・ビューでは、Oracle Databaseが各ビューの統計を収集するためには、パラメータTIMED_STATISTICSTRUEに設定する必要があります。ALTER SYSTEMまたはALTER SESSION文を使用して、TIMED_STATISTICSの設定を切り替えることができます。

V$PQ_TQSTAT

単純な例として、固有値が2種類のみの1つの列の結合による、2つの表のハッシュ結合について考えます。このハッシュ関数は、最大でも、パラレル実行サーバーAに対して1つのハッシュ値、パラレル実行サーバーBに対してもう1つのハッシュ値を生成します。DOPは2で問題ありません。4とすると少なくとも2つのパラレル実行サーバーの作業がなくなります。このような偏りを検出するには、次の例のような問合せを使用します。

SELECT dfo_number, tq_id, server_type, process, num_rows
FROM V$PQ_TQSTAT ORDER BY dfo_number DESC, tq_id, server_type, process;

この問題を解決する最適な方法は、別の結合方法の選択です。ネステッド・ループ結合が最適であると予想されます。または、結合表の一方が他方よりも小さい場合は、PQ_DISTRIBUTEヒントを使用してBROADCAST分散方法を指定できます。オプティマイザによってBROADCAST分散方法が考慮されるためには、OPTIMIZER_FEATURES_ENABLEを9.0.2以上に設定する必要があるので注意してください。

ここで、カーディナリティの高い結合キーがあるが、値の1つにほとんどのデータが含まれると仮定します。このような例としては、ラーバ・ランプの年次売上があります。大きな売上があったのは1968年のみで、1968年のレコードに対応するパラレル実行サーバーの負荷が高くなります。前述したものと同じ修正処理を使用する必要があります。

V$PQ_TQSTATビューは、表キュー・レベルのメッセージ・トラフィックの詳細なレポートを示します。V$PQ_TQSTATデータが有効なのは、パラレルSQL文を実行しているセッションから問い合せた場合のみです。 表キューは、問合せサーバー・グループ間、パラレル実行コーディネータと問合せサーバー・グループ間、または問合せサーバー・グループとコーディネータ間のパイプラインです。表キューは、PX SEND <partitioning type> (たとえば、PX SEND HASH)およびPX RECEIVEによって操作列に明示的に示されます。下位互換性のため、PARALLEL_TO_PARALLELSERIAL_TO_PARALLELまたはPARALLEL_TO_SERIALの行ラベルは前のリリースと同じセマンティックになります。従来どおり表キューの割当てを推測するために使用できます。また、パラレル計画の一番上に操作PX COORDINATORを含む新しいノードがマークされます。

V$PQ_TQSTATには、各表キューに対して読取りまたは書込みを行う問合せサーバー・プロセスごとに1行があります。10のコンシューマ・プロセスと10のプロデューサ・プロセスを接続する表キューの場合、このビューに20の行があります。バイト列を合計し、TQ_ID (表キュー識別子)によってグループ化すると、各表キューを介して送信された合計バイト数を求めることができます。この値をオプティマイザの見積りと比較します。差が大きいときは、より大きなサンプルを使用したデータの分析が必要な可能性があります。

TQ_IDでグループ化したバイト数の平方偏差を計算します。平方偏差が大きい場合はワークロードの不均衡を意味します。大きな平方偏差について調べて、プロデューサの起動時にデータ分散が不均等だったのか、分散そのものに偏りがあるのかを判別する必要があります。データそのものに偏りがある場合は、カーディナリティが低い、あるいは固有値が少ないことを意味します。

V$RSRC_CONS_GROUP_HISTORY

V$RSRC_CONS_GROUP_HISTORYビューは、非NULLプランのあるV$RSRC_PLAN_HISTORYに、パラレル文のキューイングの情報など、各エントリに対するコンシューマ・グループ統計の履歴を表示します。

V$RSRC_CONSUMER_GROUP

V$RSRC_CONSUMER_GROUPビューは、パラレル文の情報など、現在アクティブなリソース・コンシューマ・グループに関連するデータを表示します。

V$RSRC_PLAN

V$RSRC_PLANビューは、パラレル文のキューイングの状態など、現在アクティブなリソース・プランすべての名前を表示します。

V$RSRC_PLAN_HISTORY

V$RSRC_PLAN_HISTORYは、リソース・プランがインスタンスで有効化、無効化または変更された場合の履歴を表示します。履歴にはパラレル文のキューイングの状態を含みます。

V$RSRC_SESSION_INFO

V$RSRC_SESSION_INFOビューは、パラレル文のキュー統計など、リソース・マネージャ統計をセッション単位で表示します。

セッション統計の監視

ここで示す例では、「動的パフォーマンス・ビューを使用したパラレル実行パフォーマンスの監視」で説明した動的パフォーマンス・ビューを使用します。

GV$PX_SESSIONを使用して、パラレルで実行するサーバー・グループの構成を判別します。この例では、セッション9が問合せコーディネータ、セッション7および21が最初のセットの最初のグループにあります。セッション18および20は2番目のセットの最初のグループです。この問合せでリクエストされたOPと与えられたDOPはどちらも2です。これは、次の問合せによる出力に示されます。

SELECT QCSID, SID, INST_ID "Inst", SERVER_GROUP "Group", SERVER_SET "Set",
  DEGREE "Degree", REQ_DEGREE "Req Degree"
FROM GV$PX_SESSION ORDER BY QCSID, QCINST_ID, SERVER_GROUP, SERVER_SET;

出力は次のようになります。

QCSID      SID        Inst       Group      Set        Degree     Req Degree 
---------- ---------- ---------- ---------- ---------- ---------- ---------- 
         9          9          1 
         9          7          1          1          1          2          2 
         9         21          1          1          1          2          2 
         9         18          1          1          2          2          2 
         9         20          1          1          2          2          2 

シングル・インスタンスの場合、SELECT FROM V$PX_SESSIONを使用します。列名Instance IDは含めません。

GV$PX_SESSIONを使用した前の例の出力に表示されるプロセスが、同じタスクを完了するために連携します。次の例は、物理読取りに関してこれらのプロセスの進捗を判別するための、結合問合せの実行を示します。次の問合せを使用して特定の統計を追跡できます。

SELECT QCSID, SID, INST_ID "Inst", SERVER_GROUP "Group", SERVER_SET "Set",
  NAME "Stat Name", VALUE
FROM GV$PX_SESSTAT A, V$STATNAME B
WHERE A.STATISTIC# = B.STATISTIC# AND NAME LIKE 'PHYSICAL READS'
  AND VALUE > 0 ORDER BY QCSID, QCINST_ID, SERVER_GROUP, SERVER_SET;

出力は次のようになります。

QCSID  SID   Inst   Group  Set    Stat Name          VALUE      
------ ----- ------ ------ ------ ------------------ ---------- 
     9     9      1               physical reads           3863 
     9     7      1      1      1 physical reads              2 
     9    21      1      1      1 physical reads              2 
     9    18      1      1      2 physical reads              2 
     9    20      1      1      2 physical reads              2 

このタイプの問合せを使用して、V$STATNAMEの統計を追跡します。問合せサーバー・プロセスの進捗を確認するには、この問合せを必要な回数繰り返します。

次の問合せは、V$PX_PROCESSを使用して問合せサーバーのステータスを調べます。

SELECT * FROM V$PX_PROCESS;

出力は次のようになります。

SERV STATUS    PID    SPID      SID    SERIAL 
---- --------- ------ --------- ------ ------ 
P002 IN USE        16     16955     21   7729 
P003 IN USE        17     16957     20   2921 
P004 AVAILABLE     18     16959              
P005 AVAILABLE     19     16962             
P000 IN USE        12      6999     18   4720 
P001 IN USE        13      7004      7    234

システム統計の監視

V$SYSSTATビューおよびV$SESSTATビューには、パラレル実行を監視するためのいくつかの統計が含まれます。これらの統計を使用して、パラレル問合せ、DML、DDL、データ・フロー演算子(DFO)および操作の数を追跡します。問合せ、DMLまたはDDLそれぞれが、複数のパラレル操作および複数のDFOを含むことがあります。

さらに、統計では、マルチユーザー問合せ調整アルゴリズムまたは使用可能なパラレル実行サーバーの不足のために、DOPが減らされた(ダウングレードされた)問合せ操作の数もカウントされます。

また、これらのビューの統計では、パラレル実行のために送信されたメッセージ数もカウントされます。次の構文は、これらの統計を表示する方法の例です。

SELECT NAME, VALUE FROM GV$SYSSTAT
WHERE UPPER (NAME) LIKE '%PARALLEL OPERATIONS%'
OR UPPER (NAME) LIKE '%PARALLELIZED%' OR UPPER (NAME) LIKE '%PX%';

出力は次のようになります。

NAME                                               VALUE      
-------------------------------------------------- ---------- 
queries parallelized                                      347 
DML statements parallelized                                 0 
DDL statements parallelized                                 0 
DFO trees parallelized                                    463 
Parallel operations not downgraded                         28 
Parallel operations downgraded to serial                   31 
Parallel operations downgraded 75 to 99 pct               252 
Parallel operations downgraded 50 to 75 pct               128 
Parallel operations downgraded 25 to 50 pct                43 
Parallel operations downgraded 1 to 25 pct                 12 
PX local messages sent                                  74548 
PX local messages recv'd                                74128 
PX remote messages sent                                     0 
PX remote messages recv'd                                   0 

次の問合せは、システムの各スレーブ(子プロセス)および問合せコーディネータ・プロセスの現在の待機状態を示します。

SELECT px.SID "SID", p.PID, p.SPID "SPID", px.INST_ID "Inst",
       px.SERVER_GROUP "Group", px.SERVER_SET "Set",
       px.DEGREE "Degree", px.REQ_DEGREE "Req Degree", w.event "Wait Event"
FROM GV$SESSION s, GV$PX_SESSION px, GV$PROCESS p, GV$SESSION_WAIT w
WHERE s.sid (+) = px.sid AND s.inst_id (+) = px.inst_id AND
      s.sid = w.sid (+) AND s.inst_id = w.inst_id (+) AND
      s.paddr = p.addr (+) AND s.inst_id = p.inst_id (+)
ORDER BY DECODE(px.QCINST_ID,  NULL, px.INST_ID,  px.QCINST_ID), px.QCSID, 
DECODE(px.SERVER_GROUP, NULL, 0, px.SERVER_GROUP), px.SERVER_SET, px.INST_ID;

オペレーティング・システム統計の監視

Oracle Databaseで得られる情報とオペレーティング・システムのユーティリティ(UNIXベース・システムでのsarvmstatなど)で得られる情報はかなり重複しています。オペレーティング・システムでは、I/O、通信、CPU、メモリーとページング、スケジューリング、同期プリミティブに関するパフォーマンス統計が提供されます。V$SESSTATビューにも、オペレーティング・システム統計の主なカテゴリが示されます。

通常、I/Oデバイスやセマフォ操作に関するオペレーティング・システム情報を、データベースのオブジェクトや操作にマップするのは、Oracle Databaseの情報に比べて困難です。ただし、オペレーティング・システムによっては、優れた視覚化ツールが備えられており、データを収集する効率のよい手段があります。

CPUやメモリーの使用量に関するオペレーティング・システム情報は、パフォーマンスを調査するために大変重要です。おそらく最も重要な統計はCPU使用率です。下位レベルのパフォーマンス・チューニングの目標は、すべてのCPUでCPUバウンドになることです。これが達成されると、SQLレベルで作業して、CPUの使用率は低いがI/Oの使用率が高い代替計画を見つけることができます。

オペレーティング・システムのメモリーとページングの情報は、メモリー集中型データ・ウェアハウス・サブシステム(パラレルの通信、ソート、ハッシュ結合など)の間でメモリーをどのように分割するかを制御する、多数のシステム・パラメータのチューニングに役立ちます。