ヘッダーをスキップ

Oracle Database パフォーマンス・チューニング・ガイド
10gリリース2(10.2)

B19207-02
目次
目次
索引
索引

戻る 次へ

10 パフォーマンス・ビューを使用したインスタンスのチューニング

データベースの初期構成後は、インスタンスのチューニングがパフォーマンスのボトルネックを解消するために重要になります。この章では、Oracleパフォーマンス・メソッドに基づいたチューニング・プロセスを説明します。

この章には次の項があります。

インスタンスのチューニング手順

次に、インスタンスのチューニング用のOracleパフォーマンス・メソッドの主な手順を示します。

  1. 問題の定義

    パフォーマンス問題の範囲についてユーザーから候補フィードバックを取得します。

  2. ホスト・システムの検査およびOracle統計の調査

    • オペレーティング・システム、データベースおよびアプリケーション統計一式を取得後に、パフォーマンスの問題の徴候を探すためにデータを調べます。

    • 一般的なパフォーマンス・エラーのリストを検討して、収集されたデータが問題に影響を与えていることを示しているかどうかを確認します。

    • 収集されたパフォーマンス・データを使用して、何がシステムで起こっているかを示す概念モデルを構築します。

  3. 変更の実装および測定

    行う変更および変更を実装した場合に予測される結果を提示します。次に、変更を実装してアプリケーション・パフォーマンスを測定します。

  4. 手順1で定義したパフォーマンスの目的が達成されたかどうかを判断します。達成されていない場合は、パフォーマンスの目標が達成されるまで手順2と3を繰り返します。

    関連項目:

    このパフォーマンス・メソッドの理論的な説明および共通エラーのリストについては、「Oracleのパフォーマンス改善方法」を参照してください。 

この章の後半では、Oracleの動的パフォーマンス・ビューを使用したインスタンスのチューニングについて説明します。ただし、拡張機能リストによる統計の収集、監視およびチューニングには、自動ワークロード・リポジトリおよびAutomatic Database Diagnostic Monitorを使用することをお薦めします。「自動ワークロード・リポジトリの概要」および「Automatic Database Diagnostic Monitor」を参照してください。


注意:

サイトに自動ワークロード・リポジトリおよびAutomatic Database Diagnostic Monitor機能がない場合は、Statspackを使用してOracleインスタンス統計を収集できます。 


問題の定義

ソリューションの実装を試みる前に、チューニング調査の目的と問題の性質をよく理解しておくことが不可欠です。これについて理解していないと、事実上、効果的な変更は実装できません。この段階で収集されたデータを使用して、次に行うこと、および調査する事象を簡単に決定できます。

次のデータを収集します。

  1. パフォーマンスの目的を識別します。

    許容できるパフォーマンスの測定尺度は何ですか?1時間、または1秒間当たり何件のトランザクションで、応答時間が必要なパフォーマンス・レベルを満たしますか?

  2. 問題の範囲を識別します。

    スローダウンで何が影響を受けますか?たとえば、インスタンス全体は低速ですか?それは、特定のアプリケーション、プログラム、特定の操作またはシングル・ユーザーですか?

  3. 問題が発生したときの時間帯を識別します。

    その問題はピーク時間のみ明白ですか?パフォーマンスはその日の経過に伴って低下しますか?スローダウンは徐々に(月または週の単位で)発生しましたか、または突然発生しましたか?

  4. スローダウンを検証します。

    これは、問題の範囲の識別に役立ち、問題の修復のために実装された変更により実際に改善されたかどうかを判断するときの比較結果の測定基準としての役割を果たします。一貫して再生可能な応答時間またはジョブ実行時間の測定値を検索します。プログラムの動作が正常だったときよりタイミングがどのくらい悪化していますか?

  5. 変更を識別します。

    パフォーマンスが許容可能になった後に変化した内容を識別します。これにより、潜在的な原因を素早くつきとめることができます。たとえば、オペレーティング・システムのソフトウェア、ハードウェア、アプリケーション・ソフトウェアまたはOracleリリースがアップグレードされましたか?さらに多くのデータがシステムにロードされたか、データ・ボリュームまたはユーザー人口が増加しましたか?

このフェーズの終わりまでに、症状についてよく理解しておく必要があります。症状をプログラムまたはプログラム・セットにローカルなものとして識別できる場合、その問題はインスタンス全体のパフォーマンスの問題とは異なる方法で処理されます。

関連項目:

アプリケーションまたはユーザーに固有なパフォーマンスの問題の解決については、第11章「SQLチューニングの概要」を参照してください。 

ホスト・システムの検査

データベース・サーバーに対する負荷とデータベース・インスタンスを調べてください。オペレーティング・システム、I/Oサブシステムおよびネットワーク統計を検討してください。これらの領域を調べると、調査する価値のあるものは何かが容易にわかります。多層のシステムでは、アプリケーション・サーバーの中間層ホストも調べてください。

ホスト・ハードウェアを調べると、システム内のボトルネックがよくわかります。このため、相互参照と以降の診断に役立つOracleパフォーマンス・データを判断できます。

調べるデータには、次のものがあります。

CPUの使用率

アイドル状態のCPUが大量にある場合、I/O、アプリケーションまたはデータベースのボトルネックが存在する可能性があります。ただし、wait I/Oはアイドル状態のCPUとみなす必要があります。

CPU使用率が高い場合は、CPUが効果的に使用されているかどうかを判断してください。CPU使用率の大部分は、CPU使用率の高い少数のプログラムによるものですか、または均等に分散されたワークロードでCPUが消費されていますか?

CPUが使用頻度の高い少量のプログラムで使用されている場合は、プログラムを調べて原因を判断してください。一部のプロセスのみが1つのCPUの能力全体を使用しているかどうかを確認してください。プロセスによっては、この情報はCPUまたはプロセスによりワークロードがバインドされていることを示している場合があり、プロセス・アクティビティを分割またはパラレル化することで解決できます。

Oracle以外のプロセス

プログラムがOracleのプログラムではない場合は、それらのプログラムがそのような量のCPUを必要としているかどうかを識別してください。必要としている場合は、プログラムの実行をピーク以外の時間に遅らせることができるかどうかを判断します。また、これらのCPU集中型プロセスを識別すると、I/O、ネットワークおよびページングなど、リソースを使用している特定のアクティビティと、それがOracleワークロードにどのように関連付けられるかを絞り込むことができます。

Oracleプロセス

少量のOracleプロセスがほとんどのCPUリソースを使用する場合は、SQL_TRACEとTKPROFを使用してSQL文またはPL/SQL文を識別し、特定の問合せまたはPL/SQLのプログラム・ユニットをチューニングできるかどうかを確認します。たとえば、CPUを多く使用するようなキャッシュ内の多数のデータ読込み(論理読込み)に関連したSELECT文があった場合、その文のSQLの最適化によりCPUの集中的な使用を回避できます。

Oracle CPU統計

Oracle CPU統計は、複数のV$ビューで使用できます。

CPU統計の解釈

CPUタイムと実時間が異なることを認識することが重要です。8つのCPUを使用する場合、実時間の所定の時間に、8分のCPUタイムが利用できます。WindowsおよびUNIXでは、これはユーザー時間またはシステム時間(Windowsでは特権モード)となります。したがって、システム上のすべてのプロセス(スレッド)で使用される平均CPUタイムは、1分の実時間間隔当たり1分を超える可能性があります。

ある時点でのOracleが使用したシステムの時間の長さはわかります。したがって、8分が使用可能でOracleがそのうちの4分を使用している場合は、総CPUタイムの50%がOracleによって使用されていることがわかります。ユーザーのプロセスがその時間を消費していない場合は、他のプロセスが消費しています。CPUタイムを使用しているプロセスを識別し、原因を解明し、それらのプロセスのチューニングを試行してください。第20章「アプリケーション・トレース・ツールの使用方法」を参照してください。

CPU使用率が多数のOracleサーバー・プロセスに均一に分散している場合は、V$SYS_TIME_MODELビューを調べると、最長時間が消費されているプロセスを正確に把握できます。 表10-1「待機イベントおよび潜在的な原因」を参照してください。

I/Oの問題の検出

過度にアクティブなI/Oシステムは、2より大きいディスク・キューの長さ、すなわち、20〜30ミリ秒を超えるディスク・サービス時間でわかります。I/Oシステムが過度にアクティブである場合、さらに多くのディスク間にI/Oを分散させることで利益を得られる潜在的なホット・スポットの有無をチェックします。また、これらのリソースを使用して、プログラムのリソース要件を少なくして負荷を減らせるかどうかも識別します。

オペレーティング・システムの監視ツールを使用して、システム全体で実行されているプロセスを判別し、すべてのファイルに対するディスク・アクセスを監視してください。データファイルとREDOログ・ファイルを保持しているディスクは、Oracleに関連しないファイルも保持している可能性があります。データベース・ファイルを含むディスクに対する過度のアクセスを減らしてください。Oracle以外のファイルへのアクセスは、V$ビューを介してではなく、オペレーティング・システムの機能を介してのみ監視できます。

多数のUNIXシステム上のsar -d(またはiostat)やWindowsシステム上の管理パフォーマンス監視ツールなどのユーティリティは、システム全体のI/O統計を調べます。

関連項目:

プラットフォームで使用可能なツールのオペレーティング・システムのマニュアル 

V$SYSTEM_EVENTのOracle待機イベント・データをチェックして、トップの待機イベントがI/O関連かどうかを確認します。I/O関連イベントには、db file sequential readdb file scattered readdb file single writedb file parallel writeおよびlog file parallel writeが含まれます。これらはいずれも、データファイルおよびログ・ファイルに対して実行されたI/Oに対応するイベントです。これらの待機イベントのうちのいずれかが高い平均時間に該当する場合は、I/Oの競合を調べる必要があります。

自動ワークロード・リポジトリ・レポート内のI/OセクションでホストI/Oシステム・データを相互参照し、ホット・データファイルおよび表領域を識別します。さらに、オペレーティング・システムから報告されたI/O時間と、Oracleから報告された時間とを比較して、それらに一貫性があるかどうかを確認します。

I/Oの問題によって、I/Oに関連しない待機イベントが明らかになる場合もあります。たとえば、バッファ・キャッシュ内で空きバッファを検出できない場合や、ディスクへのログ書込みが完了するまでの待機時間が長い場合も、I/O問題の症状を示す場合があります。I/Oシステムを再構成する必要があるかどうかを調べる前に、I/Oシステム上の負荷を減らせるかどうかを判断します。Oracle I/O負荷を減らすには、V$SQLAREAビューを問い合せるか、または自動ワークロード・リポジトリ・レポートの'SQL ordered by Reads'セクションを確認して、多数の物理読取りを実行するSQL文を調べます。これらの文を調べて、I/Oの回数を減らすようにこれらのSQL文をチューニングする方法を調べます。

SQL文で発生したOracleに関連するI/Oの問題がある場合は、それをチューニングしてください。Oracleサーバーが使用可能なI/Oリソースを使用していない場合、I/Oをすべて使用しているプロセスを識別します。プロセスがI/Oをすべて使用している理由を判断し、次にこのプロセスをチューニングします。

関連項目:

 

ネットワーク

オペレーティング・システムのユーティリティを使用して、ネットワーク・ラウンドトリップのping時間と衝突数を調べます。ネットワークで応答時間の大幅な遅延が発生している場合は、考えられる原因を調べてください。

ネットワーク負荷を減らすには、大きいデータ転送をピーク時間外へスケジュールするか、リモート・ホストに対して要求当たり1回ずつ(またはそれ以上)アクセスせずに、要求をバッチ処理するようにアプリケーションをコーディングします。

Oracle統計の調査

問題の診断の一貫性が保たれるようにするには、Oracle統計を調べてオペレーティング・システムの統計と相互参照してください。ただし、目標がOracleインスタンスをチューニングすることにあれば、修正アクションを実装する前にOracle統計を調べてOracleの観点からリソース・ボトルネックを識別します。 「Oracle統計の解釈」を参照してください。

チューニング中に使用する一般的なOracleデータ・ソースを次に示します。

統計収集のレベルの設定

Oracleでは、初期化パラメータSTATISTICS_LEVELを提供し、データベース内で主要統計収集またはアドバイザをすべて制御します。このパラメータでは、データベースに統計収集レベルを設定します。

STATISTICS_LEVELの設定に応じて、次のように一定のアドバイザ機能または統計が収集されます。

V$STATISTICS_LEVEL

このビューには、STATISTICS_LEVELで制御される統計またはアドバイザ機能のステータスがリストされます。

関連項目:

動的パフォーマンス・ビューV$STATISTICS_LEVELの詳細は、『Oracle Databaseリファレンス』を参照してください。 

待機イベント

待機イベントは、処理を継続する前にイベントが完了するまで待機する必要があることを示すために、サーバー・プロセスまたはスレッドによって増やされる統計です。待機イベント・データは、ラッチの競合、バッファの競合、I/Oの競合などのパフォーマンスに影響を与えると思われる様々な問題の症状を表します。ただし、これらの問題は実際の原因でなく、問題の症状にすぎないことに注意してください。

待機イベントは、クラス別にグループ化されています。待機イベント・クラスには、Administrative、Application、Cluster、Commit、Concurrency、Configuration、Idle、Network、Other、Scheduler、System I/OおよびUser I/Oがあります。

サーバー・プロセスは、次の症状に対して待機します。

待機イベント統計には、イベントを待機した回数や、イベントが完了するまでの待機時間があります。TIMED_STATISTICS初期化パラメータをtrueに設定すると、各リソースを待機した時間も表示されます。

ユーザー応答時間をできるだけ少なくするには、イベントが完了するまでサーバー・プロセスが待機する時間を減らします。すべての待機イベントが同じ待機時間を持っているとはかぎりません。したがって、発生回数の多い待機イベントより、最大の合計時間を持つイベントを調べる方が重要です。通常は、少なくともパフォーマンスの監視中にTIMED_STATISTICS動的パラメータをtrueに設定することが最善です。STATISTICS_LEVELの設定の詳細は、「統計収集のレベルの設定」を参照してください。

待機イベント統計を含む動的パフォーマンス・ビュー

待機イベント統計について、これらの動的パフォーマンス・ビューを問い合せることができます。

パフォーマンス・チューニングを実行するときに、待機イベントと関連するタイミング・データを調査します。最大時間がリストされるイベントは、多くの場合、パフォーマンス・ボトルネックを顕著に示しています。たとえば、V$SYSTEM_EVENTを参照することで、多くのbuffer busy waitsが発生していると気づくことがあります。おそらく、多数のプロセスが同じブロックに挿入しようとするときに、各プロセスが他のプロセスの挿入を待機してからでないと挿入できないことが原因です。問題となっているオブジェクトに自動セグメント領域管理またはパーティション化を使用することで解決する可能性があります。V$SESSION_WAITV$SESSION_EVENTおよびV$SYSTEM_EVENTの各ビューの差異の説明は、「待機イベント統計」を参照してください。

システム統計

システム統計は通常、パフォーマンスの問題の原因をさらに示すものを見つけるために、待機イベント・データとともに使用されます。

たとえば、最大の待機イベント(待機時間の点で)がbuffer busy waitsイベントであることをV$SYSTEM_EVENTが示している場合、V$WAITSTATビューで使用できる特定のバッファ待機統計を調べて、どのブロック・タイプが最大の待機カウントと最大の待機時間を持っているかを識別します。

ブロック・タイプを識別した後、問題の発生中にV$SESSIONをリアルタイムで調べるか、問題の発生後にV$ACTIVE_SESSION_HISTORYおよびDBA_HIST_ACTIVE_SESS_HISTORYを調べ、表示されたオブジェクト番号を使用して競合されたオブジェクトも識別します。このデータの組合せは、適切な修正アクションを示しています。

統計は、多数のV$ビューで使用できます。次の内容を含む共通ビューもあります。

V$ACTIVE_SESSION_HISTORY

このビューには、1秒ごとにサンプリングされたアクティブなデータベース・セッションのアクティビティが表示されます。 「Active Session History(ASH)」を参照してください。

V$SYSSTAT

これには、ロールバック、論理および物理I/O、解析データなど、Oracleの様々な部分の統計全体が含まれています。バッファ・キャッシュ・ヒット率などの比率を計算するには、V$SYSSTATからのデータを使用します。

V$FILESTAT

これには、ファイル当たりのI/O回数や平均読込み時間など、ファイルごとの詳細なファイルI/O統計が含まれています。

V$ROLLSTAT

これには、詳細なロールバック・セグメントおよびUNDOセグメント統計が含まれています。

V$ENQUEUE_STAT

これには、エンキューが要求された回数やエンキューを待機した回数、待機時間など、各エンキューの詳細なエンキュー統計が含まれています。

V$LATCH

これには、各ラッチが要求された回数やラッチを待機した回数など、各ラッチの詳細なラッチ使用統計が含まれています。

関連項目:

動的パフォーマンス・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。 

セグメント・レベルの統計

個別のセグメントに関連するパフォーマンス問題に焦点をあてるのに役立つ、セグメント・レベルの統計を収集できます。セグメント・レベルの統計を収集して表示することは、インスタンスで競合度の高い表あるいは索引を効果的に識別するための優れた方法です。

パフォーマンスの問題を識別するために待機イベントおよびシステム統計を表示した後で、セグメント・レベルの統計を使用して問題の原因となっている特定の表または索引を検索できます。バッファ・ビジー待機が、大半の待機時間の原因になっていることをV$SYSTEM_EVENTが示している例を考えます。buffer busy waitsの原因になっているトップ・セグメントをV$SEGMENT_STATISTICSから選択できます。これにより、それらのセグメントの問題の解決に集中できます。

セグメント・レベルの統計は、次の動的ビューを使用して問い合せます。

変更の実装および測定

チューニングを実施した後、多くの場合、問題を軽減できると思われる2つまたは3つの変更を識別できます。どの変更が最高の利益を提供するかを識別するには、一度に1回の変更を実装することをお薦めします。変更の効果は、問題定義段階でみられたベースライン・データ測定と対照して測定する必要があります。

一般に、パフォーマンスの問題を持つ大半のサイトでは、一度に重複した変更を実装するので、どの変更が利益を実現したかを識別できません。これはすぐに問題になることはありませんが、どの変更が最も効果をあげ、どのような作業を優先する必要があるかを知ることは不可能なので、今後同様の問題が発生した場合に大きな障害になります。

個別に変更を実装できない場合は、異なる変更の効果の測定を試みてください。たとえば、変更された問合せのパフォーマンスを向上するために新しい索引を作成する効果とは別に、REDOの生成を最適化するために初期化変更を行う効果を測定します。SQLがチューニングされ、オペレーティング・システムのディスク・レイアウトが変更され、初期化パラメータも同時に変更されている場合は、オペレーティング・システムをアップグレードすることの利益は測定できません。

パフォーマンス・チューニングは反復的なプロセスです。インスタンス・ワイドのパフォーマンスの問題を解決する万全策が見つかることはほとんどありません。ほとんどの場合、あるボトルネックを解決しても別の(ときにはさらに悪い)問題が発生するため、優れたパフォーマンスにはパフォーマンス・チューニング段階を反復する必要があります。

いつチューニングを停止するかを知ることも重要です。パフォーマンスの最も優れた測定は、統計が理想的な値にどの程度近いかではなく、ユーザーの理解力です。

Oracle統計の解釈

インスタンスにパフォーマンスの問題があった時を示す統計を収集します。比較のためのベースライン・データをすでに収集してある場合は、問題のワークロードを最も代表するベースラインからのデータと、現行のデータを比較できます。

2つのレポートを比較する場合、それらのレポートが、システムを比較できるようなワークロードか確認してください。

関連項目:

「データ収集の概要」 

負荷の検査

待機イベントは通常、最初に検査するデータです。ただし、ベースライン・レポートがある場合は、負荷が変化したかどうかをチェックします。ベースラインがあるかどうかにかかわらず、リソースの使用率が高いかどうかを確認すると便利です。

検査する負荷に関連する統計には、redo sizesession logical readsdb block changesphysical readsphysical read total bytesphysical writesphysical write total bytesparse counttotal)、parse counthard)およびuser callsが含まれます。このデータは、V$SYSSTATから問合せが行われます。秒ごとおよびトランザクションごとに、このデータを正規化することが最も有効です。また、physical write total bytesおよびphysical write total bytesの合計を使用して、1秒当たりのI/Oの総負荷(MB)を調べるのにも便利です。結合した値には、Oracleバックグラウンド・プロセスと同様Recovery Managerバックアップおよびリカバリによって、バッファ・キャッシュ、REDOログ、アーカイブ・ログに使用されたI/Oが含まれます。

自動ワークロード・リポジトリ・レポートの「ロード・プロファイル」の項を参照してください。データは、トランザクションおよび秒ごとに正規化されています。

負荷の変更

秒ごとの負荷プロファイル統計は、スループットの変化(すなわち、インスタンスの作業実行量が毎秒ごとに増えているかどうか)を示します。トランザクションごとの統計は、アプリケーション特性の変化をベースライン・レポートからの対応する統計と比較することで識別します。

高いアクティビティ率

アクティビティ率が非常に高いかどうかを識別するには、秒ごとに正規化した統計を調べます。包括的に高い値を推薦することが難しいのは、しきい値が各サイトで異なり、アプリケーション特性、CPUの個数と速度、オペレーティング・システム、I/OシステムおよびOracleリリースで異なるからです。

次に、いくつかの一般化された例を示します(許容値は各サイトで異なります)。

待機イベント統計を使用したボトルネックへのドリルダウン

Oracleが何かの待機を処理する場合は必ず、定義済待機イベント・セットの1つを使用し、待機を記録します。これらの待機イベントは、待機クラス別にグループ化されます。Idle待機クラスには、実行する作業がなく、さらに作業が実行されるのを待っている場合にプロセスが待機するイベントすべてがグループ化されます。アイドル状態でないイベントはリソースあるいはアクションが完了するまでの非生産的な待機時間を示します。


注意:

すべての症状が待機イベントによって証明されるわけではありません。チェックできる統計については、「追加された統計情報」を参照してください。 


待機イベント・データを使用する最も効率的な方法は、待機時間別にイベントを順序付けすることです。この方法は、TIMED_STATISTICStrueに設定されているときのみ可能です。設定しない場合は、待機イベントを待機数別にランク付けします。これは、一般的に問題を最もよく表す順序付けではありません。

関連項目:

  • STATISTICS_LEVELの設定の詳細は、「統計収集のレベルの設定」を参照してください。

  • STATISTICS_LEVEL初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。

 

どこで時間が消費されているかが判明してから、次の手順を実行してください。

  1. V$SYSTEM_EVENTのデータ収集を調べます。対象のイベントは、待機時間別にランク付けする必要があります。

    待機時間の最も大きいパーセンテージを持つ待機イベントを識別します。待機時間のパーセンテージを決定するには、アイドル・イベント(Null eventSQL*Net message from clientSQL*Net message to clientおよびSQL*Net more data to clientなど)を除くすべての待機イベントの合計待機時間を追加します。各イベントの待機時間をすべてのイベントの総待機時間で除算し、5つの最も重要なイベントの相対的なパーセンテージを計算します。

    関連項目:

    • アイドル待機イベントのリストは、「アイドル待機イベント」を参照してください。

    • V$EVENT_NAMEビューの説明は、『Oracle Databaseリファレンス』を参照してください。

    • 待機イベント情報の詳細は、『Oracle Databaseリファレンス』を参照してください。

     

    別の方法として、自動ワークロード・リポジトリ・レポートの先頭の「トップ5待機イベント」の項を参照してください。この項では、待機イベント(アイドル・イベントを除く)を自動的に順序付けし、相対的なパーセンテージを計算します。

    Top 5 Timed Events
    ~~~~~~~~~~~~~~~~~~                                                % Total
    Event                                         Waits    Time (s) Call Time
    -------------------------------------- ------------ ----------- ---------
    CPU time                                                    559     88.80
    log file parallel write                       2,181          28      4.42
    SQL*Net more data from client               516,611          27      4.24
    db file parallel write                       13,383          13      2.04
    db file sequential read                         563           2       .27
    
    

    状況によっては、同程度のパーセンテージを持つイベントがいくつか存在する場合があります。このため、すべてのイベントが同じタイプのリソース要求(たとえば、すべてがI/O関連イベント)に関連している場合に、追加の証拠を提供できます。

  2. これらのイベントの待機数と平均待機時間を見てください。たとえば、I/O関連イベントの場合、平均時間がI/Oシステムが低速であるかどうかを識別するのに役立つ場合もあります。次に、自動ワークロード・リポジトリ・レポートの「Wait Event」の項から引用した、このデータの例を示します。

                                                                 Avg
                                                    Total Wait   wait     Waits
    Event                           Waits  Timeouts   Time (s)   (ms)      /txn
    --------------------------- --------- --------- ---------- ------ ---------
    log file parallel write         2,181         0         28     13      41.2
    SQL*Net more data from clie   516,611         0         27      0   9,747.4
    db file parallel write         13,383         0         13      1     252.5
    
    
  3. トップの待機イベントは、次に調査する場所を識別します。表10-1に、一般的な待機イベントを示します。高負荷SQLを調べることもお薦めします。

  4. 待機イベントで指示される関連データを調べて、このデータから得られる他の情報を確認します。この情報が待機イベント・データとの一貫性を持っているかどうかを判断します。ほとんどの場合、パフォーマンス・ボトルネックの潜在的な原因に関する理論の展開を開始するためのデータは十分にあります。

  5. この理論が有効であるかどうかを判断するには、利用可能な他の統計ですでに調べたデータの一貫性をクロスチェックします。適切な統計は問題により異なりますが、通常はV$SYSSTATやオペレーティング・システム統計などにある、負荷のプロファイル関連のデータが含まれています。他のデータとのクロスチェックを行って、展開中の理論を肯定または否定します。

待機イベントおよび潜在的な原因の表

表10-1に、待機イベントと考えられる原因との関連付けの他、次に検討するのに最も有益と思われるOracleデータの概要を示します。

表 10-1    待機イベントおよび潜在的な原因 
待機イベント  一般的な領域  考えられる原因  検索/調査 

buffer busy waits  

バッファ・キャッシュ、DBWR 

バッファ・タイプによって異なります。たとえば、索引ブロックの待機は、昇順に基づく主キーが原因である場合があります。 

問題が発生している間にV$SESSIONを調べ、競合したブロックのタイプを判別します。 

free buffer waits  

バッファ・キャッシュ、DBWR、I/O 

低速なDBWR(おそらくI/Oに起因)

小さすぎるキャッシュ 

オペレーティング・システム統計を使用して書込み時間を調べます。キャッシュが小さすぎることの証拠があるかどうかについてバッファ・キャッシュ統計をチェックします。 

db file scattered read  

I/O、SQL文のチューニング 

チューニングが適切ではないSQL

低速なI/Oシステム 

V$SQLAREAを調べて、多数のディスク読込みを実行するSQL文があるかどうかを確認します。I/OシステムとV$FILESTATをクロスチェックして、長い読込み時間をチェックします。 

db file sequential read  

I/O、SQL文のチューニング 

チューニングが適切ではないSQL

低速なI/Oシステム 

V$SQLAREAを調べて、多数のディスク読込みを実行するSQL文があるかどうかを確認します。I/OシステムとV$FILESTATをクロスチェックして、長い読込み時間をチェックします。 

enqueue待機(enq:で始まる待機) 

ロック 

エンキューのタイプにより異なる 

V$ENQUEUE_STATを参照します。 

ライブラリ・キャッシュ・ラッチ待機: library cachelibrary cache pinおよびlibrary cache lock 

ラッチの競合 

SQLの解析または共有 

V$SQLAREAを調べて、比較的多数の解析コールまたは多数の子カーソルを使用するSQL文があるかどうかを確認します(VERSION_COUNT列)。V$SYSSTATの解析統計と毎秒の対応する割合を調べます。 

log buffer space  

ログ・バッファのI/O 

小さいログ・バッファ

低速なI/Oシステム 

V$SYSSTATの統計redo buffer allocation retriesをチェックします。メモリーの構成の章の、ログ・バッファの構成の項をチェックしてください。オンラインREDOログを格納するディスクをチェックして、リソースの競合の有無をチェックします。 

log file sync  

I/O、コミット過剰 

オンライン・ログを格納する低速なディスク

バッチされないコミット 

オンラインREDOログを格納するディスクをチェックして、リソースの競合の有無をチェックします。V$SYSSTATから毎秒のトランザクション数(コミット数+ロールバック数)をチェックします。 

また、Oracle Metalinkでbuffer busy waits(34405.1)およびfree buffer waits(62172.1)に関する次の通知も確認する必要があります。

これらの通知および関連通知にアクセスするには、次のURLで「busy buffer waits」と「free buffer waits」を検索する方法もあります。

http://metalink.oracle.com

関連項目:

  • 表10-1にリストした各イベントの詳細およびクロスチェックするその他の情報は、「待機イベント統計」を参照してください。

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

 

追加された統計情報

対応する待機イベントを持たないパフォーマンスの問題を示すことのできる統計は多数あります。

REDOログ領域要求統計

V$SYSSTAT統計のredo log space requestsは、サーバー・プロセスがREDOログ・バッファ内の領域を待機するのではなく、オンラインREDOログ内の領域を待機する必要があった回数を示します。この統計と待機イベントの大きい値は、LGWRではなく、チェックポイント、DBWR、アーカイバ・アクティビティをチューニングする必要があることの標識として使用する必要があります。ログ・バッファのサイズを増やしても効果がありません。

読取り一貫性

システムは、一貫したビューを維持するために、ブロックの変更内容のロールバックに長時間を費やすことがあります。次の状況を考慮してください。

継続行による表フェッチ

V$SYSSTAT内のtable fetch continued row統計数をチェックして、移行行または連鎖行を検出できます。少数の連鎖行(1%以下)は、システム・パフォーマンスに影響を与える可能性はほとんどありません。ただし、連鎖行のパーセンテージが大きいと、パフォーマンスに影響を与える可能性があります。

ブロック・サイズより大きい行の連鎖は避けられません。そのようなデータについては、ブロック・サイズのより大きい表領域の使用を考慮してください。

ただし、小さい行の場合は、適切な領域パラメータとアプリケーション設計を使用することで連鎖を回避できます。たとえば、キー値が入力され、かつその他のほとんどの列がNULLである行を、実際のデータで更新しないでください。その行のサイズが大きくなります。その場合は初めからデータが入力された行を挿入します。

UPDATE文が行のデータ量を増やし、行がそのデータ・ブロックに収まらなくなった場合、Oracleは行全体を保持するのに十分な空き領域を持つ別のブロックを見つけようとします。そのようなブロックが利用可能であれば、Oracleは新しいブロックへ行全体を移動します。これを行の移行と呼びます。行が大きすぎて利用可能なブロックに収まらない場合、Oracleはその行を複数の断片に分割し、各断片を別々のブロックに格納します。これを行の連鎖と呼びます。行は挿入時にも連鎖される可能性があります。

移行と連鎖は、特に次の場合のパフォーマンスに影響があります。

サンプルの出力表CHAINED_ROWSの定義が、配布媒体上の使用可能なSQLスクリプトに収録されています。このスクリプトの一般的な名前はUTLCHN1.SQLですが、正確な名前と位置は使用しているプラットフォームによって異なります。出力表は、CHAINED_ROWS表と同じ列名、データ型およびサイズである必要があります。

移行行を回避するには、PCTFREEを増やします。ブロック内に使用可能な空き領域を多く残しておくと、行の拡張に対処できます。削除割合が高い表と索引を再編成すなわち再作成することもできます。頻繁に行が削除される表の場合は、データブロックに部分的に空き領域が生じることがあります。行を挿入し後から拡張する場合、行の削除されたブロックにその行が挿入されることがありますが、拡張の余地はありません。表を再編成すると主な空き領域を完全に空のブロックにできます。


注意:

PCTUSEDは、PCTFREEの反対の意味ではありません。  


関連項目:

  • PCTUSEDの詳細は、『Oracle Database概要』を参照してください。

  • 表の再編成の詳細は、『Oracle Database管理者ガイド』を参照してください。

 

解析関連の統計

アプリケーションの解析が長くなるほど、競合の可能性が高くなり、システムの待機時間が長くなります。parse time CPU(CPU解析時間)がCPUタイムの大半を占める場合、SQL文の実行ではなく解析に時間が消費されています。この場合には、アプリケーションはリテラルSQLを使用しているためにSQLを共有できないか、または共有プールの構成が適切でないことがあります。

関連項目:

第7章「メモリーの構成と使用方法」 

Oracleによる解析に費やす時間の範囲を識別するために、多数の統計が利用できます。V$SYSSTATから解析関連の統計の問合せを行います。 たとえば、次のようにします。

SELECT NAME, VALUE
  FROM V$SYSSTAT
 WHERE NAME IN (  'parse time cpu', 'parse time elapsed',
                  'parse count (hard)', 'CPU used by this session' );

解析が問題となるかどうかの判断を助けるために計算される、様々な比率があります。

待機イベント統計

V$SESSIONV$SESSION_WAITV$SESSION_EVENTおよびV$SYSTEM_EVENTの各ビューは、どのようなリソースを待機したかに関する情報を表示し、構成パラメータTIMED_STATISTICStrueに設定されている場合は、各リソースを待機した時間に関する情報も表示されます。

関連項目:

  • STATISTICS_LEVELの設定の詳細は、「統計収集のレベルの設定」を参照してください。

  • V$ビューおよびOracle待機イベントの詳細は、『Oracle Databaseリファレンス』を参照してください。

 

パフォーマンス・チューニングを実行するときに、待機イベントと関連するタイミング・データを調査します。最大時間がリストされるイベントは、多くの場合、パフォーマンス・ボトルネックを顕著に示しています。

次の各ビューには、同じデータの関連する(ただし、異なる)ビューが含まれています。

V$SESSION_WAITは現在の状態ビューであるため、V$SESSION_EVENTまたはV$SYSTEM_EVENTよりも細かい単位の情報も含まれています。このビューには、P1P2およびP3の3つのパラメータ列で現行イベントの追加識別データが含まれています。

たとえば、V$SESSION_EVENTはセッション124(SID=124)がdb file scattered readで多く待機していたことを示すことはできますが、どのファイルとブロック番号かは示しません。ただし、V$SESSION_WAITP1内のファイル番号、P2内に読み込まれたブロック番号およびP3内に読み込まれたブロック数を示します(P1P2により待機イベントがどのセグメントに対して発生するかを判断できます)。

この章では、V$SESSION_WAITの使用例を中心に説明します。ただし、時間間隔のパフォーマンス・データの収集と、パフォーマンスおよび容量分析のためにこのデータを保存することをお薦めします。この形式のロールアップ・データの問合せは、自動ワークロード・リポジトリによりV$SYSTEM_EVENTビューから行います。「自動ワークロード・リポジトリの概要」を参照してください。

最も一般的に発生するイベントについては、この章で、大/小文字を区別するアルファベット順にリストして説明します。調べる対象の他のイベント関連データも含まれています。各イベント名に使用する大/小文字区別は、V$SYSTEM_EVENTビューでの表示と同一です。

関連項目:

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

SQL*Netイベント

次のイベントは、データベース・プロセスがデータベース・リンクまたはクライアント・プロセスからの確認を待機していることを示します。

これらの待機がシステム上で、または応答時間の問題に対処しているユーザーに対して、待機時間の大部分を占めている場合、ネットワークまたは中間層がボトルネックになる可能性があります。

クライアント関連のイベントは、SQL*Net message from clientイベントで説明したとおりに診断する必要があります。dblink関連のイベントは、SQL*Net message from dblinkイベントで説明したとおりに診断する必要があります。

SQL*Net message from client

これはアイドル・イベントですが、このイベントを診断に使用できるときに何が問題でないかを説明することが重要です。このイベントは、サーバー・プロセスがクライアント・プロセスからの処理を待機していることを示します。ただし、このイベントが、長い応答時間を経験しているユーザーの待機時間の大半を生成している状況がいくつかあります。その原因は、ネットワーク・ボトルネックまたはクライアント・プロセスでのリソース・ボトルネックのいずれかである可能性があります。

ネットワーク・ボトルネック

ネットワーク・ボトルネックは、アプリケーションによってサーバーとクライアントとの間で多量の通信が発生し、ネットワークの待機時間(ラウンドトリップの時間)が長い場合に発生する可能性があります。症状には次のものがあります。

ネットワーク・ボトルネックを軽減するには、次のことを試行します。

クライアント・プロセス上のリソース・ボトルネック

クライアント・プロセスがリソースの大半を使用している場合、データベース内で実行できることはありません。症状には次のものがあります。

場合によっては、クライアント・プロセスで使用されるCPUの量により、待機しているユーザーのトラッキングのための待機時間がわかります。この場合のクライアントという用語は、n層アーキテクチャにおける、データベース・プロセス(中間層、デスクトップ・クライアント)以外の任意のプロセスを指します。

SQL*Net message from dblink

このイベントは、セッションがリモート・ノードにメッセージを送り、データベース・リンクからの応答を待機している状態であることを意味します。この時間は、次の理由で増える可能性があります。

SQL*Net more data to client

サーバー・プロセスは、クライアントにさらに多くのデータまたはメッセージを送信します。クライアントに対する以前の操作も送信されました。

関連項目:

ネットワーク最適化の詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。 

buffer busy waits

この待機は、複数のプロセスが同時にアクセスしようとしているバッファ・キャッシュ内に、いくつかのバッファがあることを示しています。バッファのクラスごとに、待機統計についてV$WAITSTATを問い合せます。buffer busy waitsを持つ共通のバッファ・クラスとして、data blocksegment headerundo headerおよびundo blockなどがあります。

次のV$SESSION_WAITパラメータ列をチェックします。

原因

考えられる原因を判別するには、最初にV$SESSIONを問い合せて、セッションがbuffer busy waitsを待機しているときのROW_WAIT_OBJ#の値を識別します。 たとえば、次のようにします。

SELECT row_wait_obj# 
  FROM V$SESSION 
 WHERE EVENT = 'buffer busy waits';

競合対象のオブジェクトとオブジェクト型を識別するには、V$SESSIONから戻されるROW_WAIT_OBJ#の値を使用してDBA_OBJECTSを問い合せます。 たとえば、次のようにします。

SELECT owner, object_name, subobject_name, object_type
  FROM DBA_OBJECTS
 WHERE data_object_id = &row_wait_obj;

処置

必要な処置は、競合対象のクラスと実際のセグメントにより異なります。

セグメント・ヘッダー

競合がセグメント・ヘッダー上にある場合、これは最も起こりうる空きリストの競合です。

ローカルに管理されている表領域で自動セグメント領域管理を行えば、PCTUSEDFREELISTSおよびFREELIST GROUPSの各パラメータを指定する必要はありません。可能であれば、手動領域管理から自動セグメント領域管理(ASSM)に切り替えます。

自動セグメント領域管理を使用できない(たとえば、表領域でディクショナリ領域管理を使用している)場合は、次の情報が関係します。

空きリストは、通常セグメントの様々なエクステント内に存在するブロックを含む空きデータ・ブロックのリストです。空きリストは、空き領域がPCTFREEに達していないブロック、または使用済領域がPCTUSEDを下回っているブロックで構成されます。FREELISTSパラメータでプロセスの空きリスト数を指定します。FREELISTSのデフォルト値は1です。最大値はデータ・ブロック・サイズによって決まります。

そのセグメントの空きリストに対する現在の設定を見つけるには、次を実行します。

SELECT SEGMENT_NAME, FREELISTS
  FROM DBA_SEGMENTS
 WHERE SEGMENT_NAME = segment name
   AND SEGMENT_TYPE = segment type;

空きリスト、または空きリスト数の増分を設定します。さらに空きリストを追加しても問題が軽減されない場合は、空きリスト・グループを使用します(このようにすると、単一のインスタンス内でも違いが出る可能性があります)。Oracle Real Application Clustersを使用する場合は、インスタンスごとに独自の空きリスト・グループを持っていることを確認します。

関連項目:

自動セグメント領域管理、空きリスト、PCTFREEおよびPCTUSEDの詳細は、『Oracle Database概要』を参照してください。 

データ・ブロック

表または索引(セグメント・ヘッダーではない)に対する競合がある場合、次のようにします。

UNDOヘッダー

ロールバック・セグメント・ヘッダーに対する競合の場合

undo block

ロールバック・セグメント・ブロックに対する競合の場合

db file scattered read

このイベントは、ユーザー・プロセスがSGA内のバッファ・キャッシュにバッファを読み取り、物理I/Oコールが戻るまで待機することを意味します。db file scattered readは、データを複数の不連続メモリー位置に読み取るために散布読取りを発行します。散布読取りは通常、マルチブロック読取りです。全体スキャンの他、(索引の)高速全スキャンでも行うことができます。

db file scattered read待機イベントは、全体スキャンが発生していることを識別します。バッファ・キャッシュへの全体スキャンを実行すると、読み取られたブロックは物理的に相互に接近していないメモリー位置に読み取られます。そのような読取りが散布読取りコールと呼ばれるのは、ブロックがメモリー全体に分散されているからです。対応する待機イベントが「db file scattered read(DBファイル散布読取り)」と呼ばれるのは、このためです。バッファ・キャッシュへの全体スキャンのためのマルチブロック(最大でDB_FILE_MULTIBLOCK_READ_COUNTブロック)読取りは、db file scattered readに対する待機として現れます。

次のV$SESSION_WAITパラメータ列をチェックします。

処置

健全なシステムでは、物理読込み待機がアイドル待機後の最大待機である必要があります。ただし、小さい索引付きアクセスを行う必要のある運用(OLTP)システム上に、ダイレクト読込み待機(パラレル問合せを持つ全表スキャンを意味する)またはdb file scattered read待機があるかどうかも確認してください。

システム上の過剰なI/O負荷を示す他の要素として、次のものがあります。

過剰なI/Oの管理

過剰なI/O待機を処理する方法はいくつかあります。有効性の順に示すと、これらの方法は次のとおりです。

  1. SQLチューニングによるI/Oアクティビティの削減。

  2. ワークロードの管理による、I/Oを実行する必要性の削減。

  3. DBMS_STATSパッケージを使用したシステム統計の収集。これにより、問合せオプティマイザでは、全体スキャンを使用する、可能なアクセス・パスのコストを正確に計算できます。

  4. 自動ストレージ管理の使用。

  5. さらに多くのディスクを追加することによる、各ディスクのI/O数の削減。

  6. 既存のディスク間へのI/Oの再配分によるI/Oホット・スポットの削減。

    関連項目:

    第8章「I/O構成および設計」 

最初に行うことは、I/Oを削減するためのチャンスを見つけることです。これらのイベントを待機するセッションを実行してSQL文の調査を開始し、V$SQLAREAから多数の物理I/Oを実行する文を調べます。過剰なI/Oを実行し、実行計画にマイナスの影響を与える可能性のある要因として、次のものがあります。

不十分なI/O分散

I/Oを削減する他、ディスク間のファイルのI/O分散も調べます。I/Oはディスク間に均等に分散されていますか、あるいは、いくつかのディスク上にホット・スポットがありますか?データベースのI/Oリクエストを満たすだけの十分な個数のディスクがありますか?

データベースによるI/O操作(読込みと書込み)の総数を調べ、それと使用したディスク数を比較します。必ず、LGWRプロセスとARCHプロセスのI/Oアクティビティを含めてください。

I/Oを待機しているセッションで実行されたSQL文の検索

次の問合せを使用して、ある時点でどのセッションがI/Oを待機しているかを判断します。

SELECT SQL_ADDRESS, SQL_HASH_VALUE
  FROM V$SESSION 
 WHERE EVENT LIKE 'db file%read';  

I/Oを必要とするオブジェクトの検索

考えられる原因を判別するには、最初にV$SESSIONを問い合せて、セッションがdb file scattered readを待機しているときのROW_WAIT_OBJ#の値を識別します。 たとえば、次のようにします。

SELECT row_wait_obj# 
  FROM V$SESSION 
 WHERE EVENT = 'db file scattered read';

競合対象のオブジェクトとオブジェクト型を識別するには、V$SESSIONから戻されるROW_WAIT_OBJ#の値を使用してDBA_OBJECTSを問い合せます。 たとえば、次のようにします。

SELECT owner, object_name, subobject_name, object_type
  FROM DBA_OBJECTS
 WHERE data_object_id = &row_wait_obj;

db file sequential read

このイベントは、ユーザー・プロセスがSGA内のバッファ・キャッシュにバッファを読み取り、物理I/Oコールが戻るまで待機することを意味します。順次読取りは、単一ブロック読取りです。

単一ブロックI/Oは通常、索引を使用した結果です。エクステント境界のため、すなわち、バッファがすでにバッファ・キャッシュ内に存在するために全表スキャン・コールが単一ブロック・コールに切り捨てられることはほとんどありません。これらの待機は、'db file sequential read'としても表示されます。

次のV$SESSION_WAITパラメータ列をチェックします。

処置

健全なシステムでは、物理読込み待機がアイドル待機後の最大待機である必要があります。ただし、パラレル問合せを持つ、全表スキャンに近いスキャンの必要な大きいデータ・ウェアハウス上に、db file sequential readsがあるかどうかも確認してください。

図10-1は、次の待機イベント間の違いを示したものです。

direct path readおよびdirect path read temp

あるセッションがバッファをディスクからPGAに直接読み込む(SGA内のバッファ・キャッシュとは反対)場合、このイベント上で待機します。I/Oサブシステムが非同期I/Oをサポートしない場合、各待機は物理読込み要求に対応します。

I/Oサブシステムが非同期I/Oをサポートする場合、このプロセスでは読込み要求の発行を、PGAにすでに存在するブロックの処理に重複させることができます。プロセスがディスクからまだ読み込まれていないPGA内のブロックにアクセスしようとする場合、待機コールを発行し、このイベントの統計を更新します。したがって、待機数は必ずしも読込み要求数と同じではありません(db file scattered readおよびdb file sequential readとは異なります)。

次のV$SESSION_WAITパラメータ列をチェックします。

原因

これは次の状況で発生します。

処置

file_idは、読込みがTEMP表領域内のオブジェクトに対するものか、パラレル・スレーブによる全表スキャンに対するものかを示します。これは、大きいデータ・ウェアハウス・サイトに対する最大待機です。ただし、ワークロードがDSSワークロードではない場合は、これが発生している理由を調べます。

ディスクでのソート

待機が発生しているセッションで、現在実行されているSQL文を調べて、ソートの原因を確認します。ソートを生成するSQL文を検索するために、V$TEMPSEG_USAGEを問い合せます。また、ソートのサイズを決定するセッションに関するV$SESSTATからの統計を問い合せます。SQL文をチューニングしてソートを削減できるかどうかを確認します。WORKAREA_SIZE_POLICYMANUALである場合、システム(ソートが大きすぎない場合)または個々のプロセスのSORT_AREA_SIZEを大きくすることを検討します。WORKAREA_SIZE_POLICYAUTOである場合、PGA_AGGREGATE_TARGETを大きくするかどうかを調べます。「PGAメモリー管理」を参照してください。

全表スキャン

高い並列度で表を定義すると、全表スキャンをパラレル・スレーブで検索するようにオプティマイザを偏らせることができます。ダイレクト・パス読取りを使用して読み取るオブジェクトをチェックします。全表スキャンがワークロードの有効な部分である場合は、I/Oサブシステムが並列度に対して適切に構成されているかどうかを確認します。ディスクのストライプ化または自動ストレージ管理(ASM)を使用していない場合は、ディスクのストライプ化を使用することを考慮してください。

ハッシュ領域サイズ

ハッシュ結合を呼び出す問合せ計画の場合、過剰なI/OはHASH_AREA_SIZEが小さすぎることから発生する可能性があります。WORKAREA_SIZE_POLICYMANUALである場合、システムまたは個々のプロセスのHASH_AREA_SIZEを大きくすることを検討してください。WORKAREA_SIZE_POLICYAUTOである場合、PGA_AGGREGATE_TARGETを大きくするかどうかを調べます。

関連項目:

 

direct path writeおよびdirect path write temp

プロセスがバッファをPGAから直接書き込む(バッファ・キャッシュからバッファを書き込むDBWRとは反対)場合、プロセスは書込みコールが完了するまでこのイベント上で待機します。ダイレクト・パス書込みを実行できる操作には、ソートがディスクに移動するとき、パラレルDML操作時、ダイレクト・パスINSERT、パラレル作成表の選択時、およびいくつかのLOB操作があります。

ダイレクト・パス読込みと同様に、I/Oサブシステムが非同期書込みをサポートする場合、待機数は発行された書込みコール数と同じではありません。セッションがPGA内のすべてのバッファを処理し、I/Oリクエストが完了するまで作業を継続できない場合、セッションは待機します。

関連項目:

ダイレクト・パス・インサートの詳細は、『Oracle Database管理者ガイド』を参照してください。 

次のV$SESSION_WAITパラメータ列をチェックします。

原因

これは次の状況で発生します。

処置

大規模なソートについては、「ディスクでのソート」を参照してください。

パラレルDMLについては、ディスク間のI/O分散をチェックし、I/Oサブシステムが並列度の大きさに対して適切に構成されているかどうかを確認してください。

enqueue(enq:)待機

エンキューは、データベース・リソースへのアクセスを調整するロックです。このイベントは、セッションが別のセッションで保持されているロックを待機していることを示します。

エンキュー名は待機イベント名の一部としてenq: enqueue_type - related_details形式で含まれています。次の関連TXタイプなど、同じエンキュー・タイプを異なる目的で保持できる場合があります。

V$EVENT_NAMEビューには、すべてのenq:待機イベントのリストが表示されます。

次のV$SESSION_WAITパラメータ列で追加情報を確認できます。

ロックおよびロック・ホルダーの検索

ロックを保持するセッションを見つけるには、V$LOCKの問合せを行います。イベント・エンキューを待機するすべてのセッションでは、REQUEST <> 0を持つV$LOCK内に行があります。次の2つの問合せのうちの1つを使用して、ロックを保持しているセッションとロックを待機しているセッションを検索します。

エンキュー待機がある場合は、次の文を使用することによりこれらを確認できます。

SELECT * FROM V$LOCK WHERE request > 0;

待機中のロックのホルダーおよびウェイタのみを表示するには、次の文を使用します。

SELECT DECODE(request,0,'Holder: ','Waiter: ') || 
          sid sess, id1, id2, lmode, request, type
   FROM V$LOCK
 WHERE (id1, id2, type) IN (SELECT id1, id2, type FROM V$LOCK WHERE request > 0)
   ORDER BY id1, request;

処置

適切な処置は、エンキューのタイプにより異なります。

STエンキュー

競合されたエンキューがSTエンキューである場合、問題は動的な領域割当てにある可能性が最も高いと言えます。セグメントにそれ以上空き領域がない場合、Oracleはセグメントにエクステントを動的に割り当てます。このエンキューは、ディクショナリ管理表領域にのみ使用します。

このリソースに対する競合を解決するには、次のようにします。

HWエンキュー

HWエンキューは、セグメントの最高水位標を超える領域の割当てをシリアライズする場合に使用します。

これがオブジェクトの競合点である場合、エクステントの手動割当てにより問題が解決されます。

TMエンキュー

TMロック上の待機の最も一般的な理由は、制約される列が索引付けされない場合の外部キー制約に関係している傾向があります。この問題を回避するには、外部キー列を索引付けします。

TXエンキュー

これらのロックは、トランザクションがその最初の変更を開始するときに排他的に取得され、トランザクションがCOMMITまたはROLLBACKを行うまで保持されます。

events in wait class other

このイベントは、「その他」の待機クラスに属し、通常はシステムで発生しないようにしてください。このイベントは、latch freeなど、「その他」の待機クラスのその他すべてのイベントの集計であり、V$SESSION_EVENTおよびV$SERVICE_EVENTビューでのみ使用されます。これらのビューでは、「その他」待機クラスのイベントは、セッションごとにはメンテナンスされません。かわりに、この1つのイベントにロール・アップされ、「その他」待機クラスのイベント統計をメンテナンスするためのメモリーを削減します。

free buffer waits

この待機イベントは、サーバー・プロセスが空きバッファを検索できず、使用済バッファを書き出すことによって空きバッファを作成するためにデータベース・ライターを転送したことを示します。使用済バッファは、内容が変更されたバッファです。使用済バッファは、DBWRがブロックをディスクに書き込み終えると、再利用するために解放されます。

原因

DBWRは、次の状況では使用済バッファの書込みを継続できない場合があります。

処置

このイベントが頻繁に発生する場合は、DBWRに対するセッション待機を調べて、DBWRを遅らせる原因があるかどうかを確認してください。

書込み

セッションが書込みを待機している場合は、書込みを遅らせている原因を解明し、修正してください。次の点をチェックします。

I/Oが低速である場合は、次のようにしてください。

キャッシュが小さすぎる場合

キャッシュが小さすぎるためにDBWRが非常にアクティブである可能性があります。バッファ・キャッシュ・ヒット率が低いかどうかを確認して、これが考えられる原因であるかどうかを調べます。また、V$DB_CACHE_ADVICEビューを使用して、それより大きいキャッシュ・サイズが有利かどうかを判断します。「バッファ・キャッシュのサイズ設定」を参照してください。

キャッシュが1つのDBWRに対して大きすぎる場合

キャッシュ・サイズが適切であり、I/Oがすでに均等に分散されている場合は、非同期I/Oを使用するか、複数のデータベース・ライターを使用して、DBWRの動作を修正できます。

複数のデータベース・ライター(DBWR)・プロセスまたはI/Oスレーブの検討

複数のデータベース・ライター・プロセスを構成したり、I/Oスレーブを使用するのは、トランザクション・レートが高い場合や、バッファ・キャッシュ・サイズが大きすぎて単一のDBWnプロセスが負荷に耐えられない場合に役立ちます。

DB_WRITER_PROCESSES

DB_WRITER_PROCESSES初期化パラメータを使用すると、複数のデータベース・ライター・プロセス(DBW0からDBW9までと、DBWaからDBWj)を構成できます。複数のDBWRプロセスを構成すると、書き込まれるバッファの識別に必要な作業が分散され、また、これらのプロセス間にI/O負荷もが分散されます。複数のデータベース・ライター・プロセスは、複数のCPUを持つシステム(CPU 8つにつき最低1つのデータベース・ライター)や、複数のプロセッサ・グループを持つシステム(最低でプロセス・グループと同数のデータベース・ライター)にお薦めします。

CPUの数またはプロセッサ・グループの数に基づいて、Oracleは、適切なDB_WRITER_PROCESSESのデフォルト設定を選択するか、ユーザー定義の設定を調整します。

DBWR_IO_SLAVES

複数のDBWRプロセスを使用することが実用的ではない場合、Oracleには複数のスレーブ・プロセス間にI/O負荷を分散できる機能があります。DBWRプロセスは、ブロックを書き出すためにバッファ・キャッシュLRUリストをスキャンする唯一のプロセスです。ただし、これらのブロックのI/OはI/Oスレーブで実行されます。I/Oスレーブの個数は、DBWR_IO_SLAVESパラメータで決定されます。

DBWR_IO_SLAVESは、(CPUが1つの場合など)複数のDB_WRITER_PROCESSESを使用できない場合を想定しています。I/Oスレーブは、非同期I/Oが使用できないときにも役立ちます。書き込まれるキャッシュ内のブロックの識別を継続するためにDBWRを解放することによって、複数のI/Oスレーブが非ブロッキング要求をシミュレートするからです。一般的に、非同期I/Oがある場合、オペレーティング・システム・レベルの非同期I/Oをお薦めします。

DBWRのI/Oスレーブは、初回のI/Oリクエストが実行されるときに、データベースが開いた直後に割り当てられます。DBWRは、I/Oの実行とは別に、DBWR関連のすべての作業の実行を継続します。I/Oスレーブは単に、DBWRのためにI/Oを実行します。バッチの書込みはI/Oスレーブ間でパラレル化されます。


注意:

DBWR_IO_SLAVESを実装するには、余分な共有メモリーをI/Oバッファと要求キューに割り当てる必要があります。複数のDBWRプロセスをI/Oスレーブと併用することはできません。I/Oスレーブを構成すると、1つのDBWRプロセスのみ起動するように設定されます。 


複数のDBWRプロセスとI/Oスレーブの選択

複数のDBWRプロセスを構成すると、単一のDBWRプロセスが、必要なワークロードに耐えられないときのパフォーマンスに有益です。ただし、複数のDBWRプロセスを構成する前に、非同期I/Oが使用でき、システム上に構成されるかどうかを確認します。システムが非同期I/Oをサポートしても現在使用されていない場合は、複数のDBWRプロセスを構成すると問題が軽減されるかどうかを確認するために非同期I/Oを使用可能にします。システムが非同期I/Oをサポートしない場合、または非同期I/Oがすでに構成され、DBWRボトルネックが依然として存在する場合は、複数のDBWRプロセスを構成します。


注意:

プラットフォーム上で非同期I/Oを使用できない場合は、DISK_ASYNCH_IO初期化パラメータをFALSEに設定して非同期I/Oを無効にできます。 


複数のDBWRを使用すると、バッファの収集と書込みがパラレル化されます。そのため、複数のDBWnプロセスは同じ数のI/Oスレーブを使用する1つのDBWRプロセスよりもスループットを向上します。このため、複数のDBWRプロセスを優先して、I/Oスレーブは使用されなくなりました。I/Oスレーブは、複数のDBWRプロセスを構成できない場合のみ使用してください。

ラッチ・イベント

ラッチは、メモリー構造を保護するためにOracleで使用される下位レベルの内部ロックです。ラッチ解放イベントは、サーバー・プロセスがラッチを取得しようとしたときに更新され、ラッチは最初の試行で使用できなくなります。

通常は大きな競合を生成する一般的なラッチ用に、専用のラッチ関連待機イベントがあります。これらのイベントの場合は、latch: library cacheまたはlatch: cache buffers chainsのように、ラッチ名が待機イベント名に含まれます。このため、ラッチに関連するほとんどの競合の原因が特定のタイプのラッチであるかどうかをすばやく確認できます。他のすべてのラッチの待機は、汎用のlatch free待機イベントにグループ化されています。

関連項目:

ラッチおよび内部ロックの詳細は、『Oracle Database概要』 を参照してください。 

処置

このイベントは、ラッチ待機がシステム上の待機時間全体の重要な部分である場合か、または問題が発生している個々のユーザーに対してのみかを考慮してください。

次のV$SESSION_WAITパラメータ列をチェックします。

例: 現在待機されているラッチの検索

SELECT EVENT, SUM(P3) SLEEPS, SUM(SECONDS_IN_WAIT) SECONDS_IN_WAIT
  FROM V$SESSION_WAIT
 WHERE EVENT LIKE 'latch%'
  GROUP BY EVENT;

前述の問合せには、インスタンスまたは長期的なインスタンスのチューニングよりも、セッションのチューニングまたは短期的なインスタンスのチューニングに関して多くの情報が示されるという問題があります。

次の問合せは長期的なインスタンス・チューニングの詳細情報を提供し、ラッチの待機がデータベース全体の時間に占める割合が大きいかどうかを示します。

SELECT EVENT, TIME_WAITED_MICRO, 
       ROUND(TIME_WAITED_MICRO*100/S.DBTIME,1) PCT_DB_TIME 
  FROM V$SYSTEM_EVENT, 
   (SELECT VALUE DBTIME FROM V$SYS_TIME_MODEL WHERE STAT_NAME = 'DB time') S
 WHERE EVENT LIKE 'latch%'
 ORDER BY PCT_DB_TIME ASC;

ラッチ待機固有でない、より汎用的な問合せは次のようになります。

SELECT EVENT, WAIT_CLASS, 
      TIME_WAITED_MICRO,ROUND(TIME_WAITED_MICRO*100/S.DBTIME,1) PCT_DB_TIME
  FROM V$SYSTEM_EVENT E, V$EVENT_NAME N,
    (SELECT VALUE DBTIME FROM V$SYS_TIME_MODEL WHERE STAT_NAME = 'DB time') S
   WHERE E.EVENT_ID = N.EVENT_ID
    AND N.WAIT_CLASS NOT IN ('Idle', 'System I/O')
  ORDER BY PCT_DB_TIME ASC;

表 10-2    ラッチ解放イベント 
ラッチ  SGA領域  考えられる原因  検索対象 

共有プール、
ライブラリ・キャッシュ 

共有プール 

文の再利用不足

バインド変数を使用しない文

アプリケーション・カーソル・キャッシュのサイズが不十分

各実行後に明示的にクローズされたカーソル

頻繁なログオン/ログオフ

基礎的なオブジェクト構造の変更(たとえば、切捨て)

小さすぎる共有プール 

次の項目が高いセッション(V$SESSTAT内)

  • CPU解析時間

  • 所要解析時間

  • 解析カウント(ハード)/実行カウントの比率

  • 解析カウント(合計)/実行カウントの比率

次のカーソル(V$SQLAREA/V$SQLSTATS内)

  • PARSE_CALLS / EXECUTIONSの高い比率

  • EXECUTIONS = 1 WHERE句のリテラルのみ異なる(すなわち、バインド変数を使用しない)

  • 高いRELOADS

  • 高いINVALIDATIONS

  • 大きい(> 1MB)SHARABLE_MEM

 

キャッシュ・バッファLRU連鎖 

バッファ・キャッシュLRUリスト 

過剰なバッファ・キャッシュ・スループット。たとえば、正しくない索引に繰り返しアクセスする非効率的なSQL(大きい索引レンジ・スキャン)、または多くの全表スキャンがあります。

実行中のワークロードに耐えられないDBWR。これにより、フォアグラウンド・プロセスが空きバッファを検索するためにラッチを保持する時間が長くなります。

小さすぎるキャッシュ 

論理I/Oまたは物理I/Oが非常に多く、選択性のない索引が使用される文 

キャッシュ・バッファ連鎖 

バッファ・キャッシュ 

ホット・ブロックと呼ばれる1つ(または少数)のブロックへのアクセスの繰返し 

順序番号ジェネレータを使用せずに番号を生成するための、表の行を更新する順序番号生成コード

非常に多くのプロセスが、きわめて類似した述語を使用して選択性のない同一の索引をスキャンすることから発生する、索引リーフ・ブロックの競合

ホット・ブロックが属するセグメントの識別 

行キャッシュ・オブジェクト 

 

 

 

共有プールとライブラリ・キャッシュ・ラッチの競合

共有プールまたはライブラリ・キャッシュ・ラッチの競合の主な原因は解析です。不要な解析および不要な解析の様々なタイプの識別に使用できる手法は多数あります。

非共有SQL

この方法では、リテラルがバインド変数と置換された場合に共有できる類似したSQL文を識別します。その概念は次のいずれかです。

再解析された共有可能なSQL

V$SQLSTATSビューをチェックします。次の問合せを入力してください。

SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS 
  FROM V$SQLSTATS
ORDER BY PARSE_CALLS;

PARSE_CALLSの値が指定の文のEXECUTIONS値に近い場合は、その文の再解析を継続できます。解析コールが多い文をチューニングします。

セッション別

不要な解析コールが発生しているセッションを識別して、不要なコールを識別します。特定のバッチ・プログラムやある種のアプリケーションがほとんどの再解析を行っている場合があります。これを行うには、次の問合せを実行します。

SELECT pa.SID, pa.VALUE "Hard Parses", ex.VALUE "Execute Count" 
  FROM V$SESSTAT pa, V$SESSTAT ex 
 WHERE pa.SID = ex.SID 
   AND pa.STATISTIC#=(SELECT STATISTIC# 
       FROM V$STATNAME WHERE NAME = 'parse count (hard)') 
   AND ex.STATISTIC#=(SELECT STATISTIC# 
       FROM V$STATNAME WHERE NAME = 'execute count') 
   AND pa.VALUE > 0; 

結果として、すべてのセッションおよびリストとセッションで実行された解析の量が得られます。セッション識別子(SID)ごとに、V$SESSIONで、再解析の原因となっているプログラムの名前を検索します。


注意:

この問合せではインスタンス起動後のすべての解析コールがカウントされるため、解析率の高いセッションを検索することをお薦めします。たとえば、50日間の接続が高い解析値を示すとしても、2番目の10分間の接続の方がより速い速度で解析される場合があります。 


出力は、次のようなものです。

   SID  Hard Parses  Execute Count
------  -----------  -------------
     7            1             20
     8            3          12690
     6           26            325
    11           84           1619
キャッシュ・バッファLRU連鎖

cache buffers lru chainラッチは、キャッシュ内のバッファのリストを保護します。リストからバッファの追加、移動または削除を行う場合、ラッチを取得する必要があります。

対称型マルチプロセッサ(SMP)システムでは、Oracleによって、LRUラッチの数がシステムのCPU数の2分の1に等しい値になるように自動的に設定されます。非SMPシステムでは、LRUラッチは1つあれば十分です。

LRUラッチの競合は、多数のCPUを備えたSMPシステムでのパフォーマンスを低下させることがあります。LRUラッチの競合は、V$LATCHV$SESSION_EVENTおよびV$SYSTEM_EVENTに問い合せることによって検出できます。競合を回避するには、アプリケーションのチューニング、DSSジョブのバッファ・キャッシュのバイパスまたはアプリケーションの再設計を検討してください。

キャッシュ・バッファ連鎖

cache buffers chainsのラッチは、バッファ・キャッシュでバッファ・リストを保護する場合に使用します。これらのラッチは、バッファの検索、追加、およびバッファ・キャッシュからバッファを削除する場合に使用します。このラッチの競合は、競合度の高い(ホットな)ブロックが存在することを意味します。

頻繁にアクセスされるバッファ連鎖を識別し、競合するブロックを識別するには、V$LATCH_CHILDRENビューを使用してcache buffers chainsのラッチのラッチ統計を調べます。他の子ラッチと比較して、多くのGETSMISSESおよびSLEEPSを持つ特定のcache buffers chainsの子ラッチがある場合、これは子ラッチで競合します。

このラッチには、ADDR列で識別されるメモリー・アドレスがあります。このラッチで保護されているブロックを識別するには、X$BH表と結合されたADDR列の値を使用します。たとえば、頻繁に競合するラッチのアドレス(V$LATCH_CHILDREN.ADDR)を指定すると、ファイル番号とブロック番号の問合せが作成されます。

SELECT OBJ data_object_id, FILE#, DBABLK,CLASS, STATE, TCH
  FROM X$BH
 WHERE HLADDR = 'address of latch'
  ORDER BY TCH;

X$BH.TCHは、バッファのタッチ・カウントです。X$BH.TCHの値が高い場合は、ホット・ブロックであることを示します。

各ラッチで保護されるブロックは多数あります。これらのバッファのうちの1つは、ホット・ブロックであると考えられます。TCH値の高いブロックは、潜在的なホット・ブロックです。この問合せを複数回実行し、出力に一貫して表示されるブロックを識別します。ホット・ブロックを識別した後は、ファイル番号とブロック番号を使用してDBA_EXTENTSの問合せを行い、セグメントを識別します。

ホット・ブロックの識別後に、次の問合せを使用してそのホット・ブロックが属するセグメントを識別できます。

SELECT OBJECT_NAME, SUBOBJECT_NAME
  FROM DBA_OBJECTS
 WHERE DATA_OBJECT_ID = &obj;

この問合せで&objは、X$BHへの前述の問合せにおけるOBJ列の値です。

行キャッシュ・オブジェクト

row cache objectsラッチは、データ・ディクショナリを保護します。

log file parallel write

このイベントには、ログ・バッファからREDOログ・ファイルへのREDOレコードの書込みが含まれます。

library cache pin

このイベントでは、ライブラリ・キャッシュの同時実行性を管理します。オブジェクトが確保されると、ヒープがメモリーへロードされます。クライアントがオブジェクトを修正または調査する場合、クライアントはロック後にPINを取得する必要があります。

library cache lock

このイベントは、ライブラリ・キャッシュのクライアント間の同時実行性を制御します。オブジェクト処理のロックが取得され、次のいずれかが可能になります。

また、このロックはライブラリ・キャッシュにオブジェクトを配置するためにも取得されます。

log buffer space

このイベントは、サーバー・プロセスがログ・バッファ内の空き領域を待機しているときに発生します。これは、LGWRがREDOを書き出すよりも、すべてのREDOが生成される方が速いためです。

処置

REDOログ・バッファ・サイズを修正します。ログ・バッファのサイズがすでに適切なものである場合、オンラインREDOログが存在するディスクがI/O競合を受けないようにします。log buffer space待機イベントは、REDOログが存在するディスク上のディスクI/O競合を示しているか、小さすぎるログ・バッファを示している可能性があります。REDOログを含むディスクのI/Oプロファイルをチェックして、I/Oシステムがボトルネックであるかどうかを調べます。I/Oシステムが問題ではない場合、REDOログ・バッファが小さすぎる可能性があります。このイベントが問題にならなくなるまで、REDOログ・バッファのサイズを大きくします。

log file switch

一般に発生する待機イベントは、次の2つです。

いずれのイベントでも、LGWRは次のオンラインREDOログに切り替えることはできず、すべてのコミット要求はこのイベントを待機します。

処置

log file switcharchiving needed)イベントの場合、アーカイバがタイムリにログをアーカイブできない理由を調べます。次の理由が考えられます。

ボトルネックの性質により、I/Oを再分散したり、アーカイブ先に領域を追加して問題を軽減することが必要な場合があります。log file switchcheckpoint incomplete)イベントの場合、次を実行してください。

log file sync

ユーザー・セッションがコミットする(またはロールバックする)場合、LGWRでセッションのREDO情報をREDOログ・ファイルにフラッシュする必要があります。COMMITまたはROLLBACKを実行するサーバー・プロセスは、REDOログへの書込みが完了するまで、このイベントで待機します。

処置

このイベントの待機がシステム上での長時間の待機か、応答時間の問題が発生しているユーザーまたはシステム上のユーザーによる長時間の待機を構成している場合は、平均待機時間を調べます。

平均待機時間は短いが、待機数が多い場合、アプリケーションはCOMMITをバッチ処理するのではなく、すべてのINSERT後にコミットできます。アプリケーションは、行ごとではなく50行後にコミットして待機を減らすことができます。

平均待機時間が多い場合は、LGWRに対するセッション待機を調べ、何を実行および待機するために多くの時間を費やしているかを調べます。待機が低速のI/Oによるものである場合は、次のことを試行してください。

rdbms ipc reply

このイベントは、バックグラウンド・プロセスのうちの1つから応答を待機する場合に使用します。

アイドル待機イベント

これらのイベントはIdle待機クラスに属し、作業がないためにサーバー・プロセスが待機中であることを示します。これは通常、ボトルネックが存在する場合にボトルネックがデータベース・リソースに対するものではないことを意味します。チューニングの際、アイドル・イベントの大部分を無視することが必要なのは、アイドル・イベントがパフォーマンス・ボトルネックの性質を示さないためです。アイドル・イベントの中には、ボトルネックでないものを示す際に役立つものがあります。このタイプのイベントの例として、最も一般的に発生するアイドル待機イベントであるSQL Net message from clientがあります。表10-3に、このアイドル・イベントと他のアイドル・イベント(およびそれらのカテゴリ)のリストを示します。

表 10-3    アイドル待機イベント 
待機名  バックグラウンド・
プロセス・
アイドル・イベント
 
ユーザー・プロセス・
アイドル・イベント
 
パラレル問合せ
アイドル・
イベント
 
共有サーバー・
アイドル・
イベント
 
Oracle Real Application Clusters
アイドル・イベント
 

dispatcher timer  

× 

pipe get  

× 

pmon timer  

× 

PX Idle Wait  

× 

PX Deq Credit: need buffer  

× 

rdbms ipc message  

× 

smon timer  

× 

SQL*Net message from client  

× 

virtual circuit status  

× 

関連項目:

各アイドル待機イベントの説明は、『Oracle Databaseリファレンス』を参照してください。 


戻る 次へ
Oracle
Copyright © 2000, 2008, Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引