B, Ú×‚ɂ‚¢‚Ä‚ÍOracle Coherence‚̃hƒLƒ…ƒƒ“ƒg‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B, ‚±‚̃ZƒbƒVƒ‡ƒ“ŠÇ—ƒGƒ“ƒWƒ“‚̓f[ƒ^‚ðˆÃ†‰»‚µ‚Ü‚¹‚ñB, ƒZƒbƒVƒ‡ƒ“ŠÇ—ƒGƒ“ƒWƒ“‚́AƒZƒbƒVƒ‡ƒ“Eƒf[ƒ^‚ðƒf[ƒ^ƒx[ƒX‚ɏ‘‚«ž‚ލۂɈ͆‰»‚ðs‚È‚¢‚Ü‚¹‚ñB, Œœ”O‚ª‚ ‚éê‡‚́AOracle Advanced Security‚È‚Ç‚ðŽg—p‚µ‚ăf[ƒ^ƒx[ƒX“à‚̈͆‰»‚ðs‚È‚Á‚Ä‚­‚¾‚³‚¢B. (4)セッションファイルを作成したり、ファイル日付を更新したりする。 (5)セッションの情報に変化があれば、その都度データを書き込む。 (6)セッションを閉じる。 (3)と(4)の順番は検証ができないので、確かではありません。 ョン・サーバーから送信された実行コンテキストの識別子. セッションが待機中であると分かった後、次に確認すべきことは、それまでのセッションの待機時間です。 非常に長い間待機中の場合は、何らかのボトルネックが発生しています。 では、待機時間に関する情報はどこで取得できるのでしょうか。 待ち時間が多くてもスループットは同じ? 次に、このロックを必要とする処理が1回あたり0.1秒かかるとして、待ち時間の平均を計算します。セッション数が2の場 合、enqueue待ちの平均は0.1秒で、セッション数が3の場合、0.2秒になります。 セッションが現在待機中の場合、値は現在の待機が開始されるまで待機した時間。セッションが待機中でない場合、値は前回の待機開始以降の時間。 wait_time_microおよびtime_since_last_wait_micro列が設定されている場合、この列は非推奨になる。 state: varchar2(19) MaxGauge for Oracleは、セッション情報やSQL実行情報を取得してリポジトリDBに過去の情報を保存しています。 この(c) Tanel Poder見てください。 あなたのglogin.sqlから実行することもできます(これらの設定は、接続するたびに更新されるか、手動で実行するだけです)。 Oracleには、同時に接続するセッション数を制限するパラメタがあります。以下のクエリで、データベースに同時に接続できるOSのユーザー・プロセスの最大数を確認できます。 connect sys/oracle as sysdba show parameter SESSIONS; show parameter PROCESSES; Oracleで特定のセッションを強制終了しようと ALTER SYSTEM KILL SESSION ‘xx,xxxxx’ IMMEDIATE を実行したのに、STATUS状態が KILLED のまま残り動き続けてしまうことが時々あります。 「よくあること」だそうですが。。。 そんな時は、OSの kill コマンドでセッションを強制終了させる方法が次の … Copyright © 2010, Oracle and/or its affiliates. また、SQLは実行計画別に稼働情報が保存されているので実行計画の変化や変化したことによる動作の変化などを確認することが出来ます。, 特定のSQLの過去の実行状況を調査するには、[Performance Analyzer]画面の[SQL分析][長期分析][1-SQL]で調査することが出来ます。, [Realtime Monitor]画面の右上部[PERFORMANCE ANALYZER]ボタンをクリックして[Performance Analyzer]画面を表示します。, 別窓で表示される1日トレンドの画面は、調査対象SQLの10分毎の実行統計の結果を確認することが出来ます。 Oracle Access Manager 11gはOracle Coherenceを使用して分散キャッシュのデータ・アクセス待機時間を短縮し、分散キャッシュ間で(およびセッション・ストアへ)データを透過的に移動します。 All rights reserved. Oracleには、同時に接続するセッション数を制限するパラメタがあります。以下のクエリで、データベースに同時に接続できるOSのユーザー・プロセスの最大数を確認できます。 connect sys/oracle as sysdba show parameter SESSIONS; show parameter PROCESSES; 私は昨日の午後それを実行して以来、少なくともすべてがスムーズに実行されている、問題を解決したsp_recompileを実行しているように見える、それを見て、それが速く留まるかどうかを確認します。, しかし、sp内の内容を変更したときに再コンパイルが行われていないことを理解していないか?, 私たちは、宣言されたテーブルと、最終的には20行から100行までを返す2つの外部結合を含む非常に単純なspを持っています。, このSPを問い合せると、生産環境とテスト環境の両方でパフォーマンスが低下していますので、最近ではより効率的になるように書き直し、テスト環境で優れたパフォーマンスでテストしました。, 私たちはまだそれが非常に遅く、呼び出されたときに.NET 2.0アプリケーションがタイムアウトに陥っていることを知るためにプロダクションにリリースしました。, 私たちは何も理解せず、運用データベースのManagement Studioに入り、そこにspを実行し、1秒未満で実行します。, つまり、私たちのアプリケーションから実行されたとき、それは極端に遅く、タイムアウトを引き起こします.Management Studioから実行した場合、非常に高速で、1秒以上かかることはありません。, SQL Server 2005についてよく知っている人なら、これに関するヒントを教えてください。, デッドロックが発生していないことを確認できますか? 管理スタジオからの実行は、アプリケーションから、これがより大きなトランザクションの一部である場合には、隔離されます。, 私はあなたの問題が "パラメータスニッフィング"かもしれないと思います。 これは、SQL Serverの実行環境が、コンパイル中にspのパラメータ値を「スニッフィング」したり、再コンパイルしてより速い実行計画を生成したりするプロセスです。 しかし時にはそれはspの現在のデータと共に、本当に遅いspを作るパラメタの組み合わせを得ます。, そこにいくつかの良い説明があります。 で検索します。 これは良いです: http : //omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html, 考えられる解決策の1つは、spにローカル変数を作成し、入力パラメータ値をそれらに設定することです。 次に、spでローカル変数のみを使用します。, //omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html, 32ビットのループカウンタを64ビットに置き換えると、狂ったパフォーマンスの偏差が生じます. しばらく(数時間以上)経っても、レコードが残り続ける状態になってしまいます。 セッションキル時に発生する例外 リクエストされた操作の実行中にエラーが発生しました: ORA-00031: セッションは強制終了されます。 00031. 00000 - "session marked for kill" 日本オラクル株式会社 コンサルティング統括本部テクノロジーコンサルティング本部 小田 圭二(おだ けいじ), 皆さんの中にも、このような説明を見た方が多いかもしれません。特にチューニング経験が豊富な方は、この説は大体正しいと感じると思います。私の感覚では10回中7回か8回程度正しいのではないでしょうか。 All rights reserved. 待ち時間が多くてもスループットは同じ? 次に、このロックを必要とする処理が1回あたり0.1秒かかるとして、待ち時間の平均を計算します。セッション数が2の場 合、enqueue待ちの平均は0.1秒で、セッション数が3の場合、0.2秒になります。 Copyright © 2008, Oracle Corporation Japan. この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。, Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。, 1996年日本オラクル入社。人事教育本部にて、新卒や中途採用社員に対し、データベースやOS、ネットワークの講師を5年ほど経験した後、2000年にテクノロジーコンサルティング本部に異動。 テクノロジーのコンサルタントとして、主に大規模ミッションクリティカルシステムを担当。, ポリシーは、「OracleもOS上で動くアプリケーションにすぎない。だから、OS、ストレージ、ネットワークを学ぶべき」。 スキル面の興味は、アーキテクチャ、DBA、インフラ技術、教育、コンサル手法など。, 注4:実体としてのキューを持っていないような待ち行列も含みます。例えば、ラッチはキューで管理されているわけではありません。しかし、レスポンスタイムは待ち行列の特性を持っています。, 世間で一般的なOracleパフォーマンス分析方法の問題点(1) 合計と平均のマジック, 世間で一般的なOracleパフォーマンス分析方法の問題点(2) 瞬間的な待ち行列のマジック, 世間で一般的なOracleパフォーマンス分析方法の問題点(3) 計測ポイントのマジック, 世間で一般的なOracleパフォーマンス分析方法の問題点(2)~瞬間的な待ち行列のマジック, 世間で一般 的なOracleパフォーマンス分析方法の問題点(3)~計測ポイントのマジック, 入力したキーワードの同義語を使用してください。たとえば、「ソフトウェア」の代わりに「アプリケーション」を試してみてください。. データベースの動作が遅い原因に関するトラブルシューティングを始める前に、まずデータベース自体は遅くも速くもなく、安定した速度を保っていることを理解する必要があります。 一方で、データベースに接続しているセッションの動作は、セッション内での一時的な問題の発生時に遅くなります。 セッションのパフォーマンス問題を解決するためには、そのような一時的な問題を特定して解消する必要があります。 幸いにも、一時的な問題の特定と解消は、ほとんどの場合に非常に簡単な作業です。, セッションのパフォーマンス問題を解決するための最初のステップは、そのデータベース・セッションの現在の動作状況を突き止めることです。 Oracle Databaseセッションの状態は常に、以下の3つのいずれかに該当します。, 作業が割り当てられるのを待っている(アイドル状態の)セッションでは、動作が遅くなることはありません。単純に実行することが何もないだけです。 ブロックやロックなどのリソース待ちの状態にあるセッションの場合は、処理を停止しています。 セッションは、そのリソースを取得するまで待ち続けます。 そのリソースを取得したときには、何らかの処理を実行し、次の必要なリソースに移って、そのリソースが利用可能になるまで待機し、また処理を開始します。そのセッションで他に行うべきことがなくなるまで、このサイクルが継続します。 リソース待ちの頻度が高い場合、セッションの動作は遅く感じられますが、 実際に遅いわけではありません。単純に、実行、停止、再実行、再停止と続くパターンに従っているだけです。 そのため、ここでの目標は、セッション内で"停止"している問題を特定して解消することになります。, セッション停止の原因に関する情報を取得する作業は、どれほどの難易度でしょうか。 実際のところ、この作業は非常に簡単です。 Oracle Databaseは、データベースのセッションの動作状況について表示する機能を搭載しています。 必要な作業は、注意深く調査し、その情報を正しい場所で探すことです。V$SESSIONというビューがその正しい場所となります。 分析に必要となる情報は、すべてこのビューから取得できます。, V$SESSIONビューの使用法を説明するために、ごく一般的なシナリオである行ロックを例として取り上げます。 この記事に従って作業を進めるには、まず前述の表のセットアップを行います(この記事のオンライン版で説明)。 次に、異なる2つのセッションから、ARUPユーザーで接続します。 1つ目のセッションでは、次のSQL文を発行します。, この記事のテスト・ケースをセットアップするには、この"セットアップ"の項にあるSQLを実行します。 このSQLは、SYSユーザーへのアクセス権があること、ARUPというユーザーを作成できること(つまり、同じ名前のユーザーがいないこと)、空き領域が64KB以上のUSERSという表領域があることを前提としています。, 出力結果は"1 row updated"です。これは、指定した行が更新されたことを示します。 この文の後にCOMMITを発行しないでください。 コミットしないことで、このセッションにT1表の1行目のロックを取得して保持させます。 次に、2つ目のセッションで次のSQL文を発行します。, この文は、応答がない状態になります。 その理由は 簡単です。 1つ目のセッションが行のロックを保持しているために、2つ目のセッションの応答がないのです。その結果、ユーザーは、セッションの動作が遅いと不満を言うことになります。 2つ目のセッションの動作状況を把握するために最初に確認すべき情報は、V$SESSIONのSTATE列です。, 出力結果をよく見てみましょう。 セッション3346(SID列)は待機中となっています。つまり、現在動作していません。 これが、そのセッションでパフォーマンス上の一時的な問題が発生していることを示す最初の手がかりとなります。 しかし、セッションが何を待っているのかを明らかにする前に、出力結果のセッション2832の状態を確認しましょう。セッション2832は、以前に一定期間待機していたことが分かります。 重要な点は、セッション2832が現在待機中ではないことです。つまり、生産的に動作しています。, 次に、2つ目のセッション(3346)が何を待っているかについて確認します。 その情報は、同じV$SESSIONビューのEVENT列で簡単に取得できます。 EVENT列には、現在セッションが待っているイベントだけではなく、セッションが以前に待っていたイベントについても示されます。 リスト1のV$SESSIONに対する問合せによって、両方のセッションに関するEVENT列の情報が表示されます。, コード・リスト1:セッションの情報、セッションの状態、イベントを表示するための問合せ, リスト1の出力結果から、セッション3346が現在イベント待ちの状態であることが分かります。そのイベントの"enq: TX – row lock contention"は、"enqueue for transaction-level lock on row"の省略形であり、簡単に言えば行レベル・ロックを指しています。 セッションが待機中である原因は、ロックしようとした行(複数行の場合もあります)に対して別のセッションがすでにロックを保持していることにあります。 その別のセッションでトランザクションのコミットまたはロールバックが実行されない限り、セッション3346は必要なロックを取得できず、待つしかありません。 一方、セッション2832の状態は"WAITED KNOWN TIME"です。これは、現時点で待機中ではなく動作中であることを表します。 ただし、セッション2832は以前に"SQL*Net message from client"というイベントを待っていました(このイベントについては後ほど取り上げます)。 これらの結果から非常に重要な点を学ぶことができます。 それは、EVENT列を確認するだけでは、セッションが何を待っているかを理解できないということです。 まず、STATE列でセッションが待機中か動作中かを確認して、その後EVENT列を調査する必要があります。, セッションが待機中であると分かった後、次に確認すべきことは、それまでのセッションの待機時間です。 非常に長い間待機中の場合は、何らかのボトルネックが発生しています。 では、待機時間に関する情報はどこで取得できるのでしょうか。 その答えは、V$SESSIONビューのSECONDS_IN_WAIT列です。, セッションの待機時間の取得は、現時点で待機中のセッションに対しては意味がありますが、現在動作中のセッションについてはどうでしょうか。 前述のとおり、EVENT列には、セッションで現在発生しているイベントに加えて、最後に発生した待機イベントについても示されます。 さらに、同じV$SESSIONビューにある別の列のWAIT_TIMEに、その待機時間が示されます (WAIT_TIMEの単位は100分の1秒です)。, これまでに、待機中および動作中のセッションに関する情報の取得方法が分かりました。次に、これらすべての情報を1つの問合せ内にまとめて表示します(リスト2を参照)。 この問合せによって、セッションの状態が明らかになります。その状態とは、セッションが動作中か待機中か、動作中の場合は以前に何をどれほどの時間待っていたのか、待機中の場合は現在何をどれほどの時間待っているのか、です。, コード・リスト2:セッションの情報、セッションの状態、待機状態の詳細を表示するための問合せ, ここで、リスト2のセッション4208の詳細を確認すると、セッションは現在待機中であり、その時間は5,498秒で、対象は"SQL*Net message from client"イベントです。 前項で説明しましたが、Oracle Databaseセッションの状態は、動作中、リソース待ち、作業待ちのいずれかに該当します。 では、セッションがアイドル状態かどうかを判断するにはどうすれば良いでしょうか。 セッション4208は、クライアントからSQL*Net経由で作業が割り当てられることを期待しています。しかし、クライアントからの作業割当ての有無をセッションが事前に把握する手段はなく、 SQL*Net経由で何らかの命令が来るのを待つことしかできません。 それまでにセッションが実行できることは、SQL*Netインタフェースの状況を積極的に監視することだけです。そして、この状況を表している箇所が、V$SESSIONビューのEVENT列の"SQL*Net message from client"であり、これは実質的に単なるアイドル状態であることを表しています。, 同じくEVENT列の値である"rdbms ipc message"は無視してかまいません。この値は、アイドル状態にあるセッション向けのイベントの状態だからです。 アイドル状態のセッションでも、STATE列の値にIDLEと示されることはなく、"Waiting"と示されることに注意してください。 セッションが本当にアイドル状態であるかを判断するには、EVENT列を確認する必要があります。, リスト2の問合せを修正し、"SQL*Net message from client"および"rdbms ipc message"のアイドル・イベントを含むセッションをフィルタリングしたいと思うかもしれません。 このフィルタリング自体は可能ですが、さまざまな理由によりお勧めしません。 まず、"SQL*Net message from client"イベントのすべてのインスタンスが、セッションがアイドル状態であることを示すわけではありません。 たとえば、ネットワークの動作が本当に遅くなっている可能性もあります。その場合、セッションではネットワーク関連のイベント待ちも発生します。 注意すべき点として、クライアントが本当にアイドル状態なのか、動作の遅い命令を送信中なのか、ネットワークで遅延が発生しているのかをセッションで判別することはできません。 セッションが実行できることは待つことだけで、その待機に"SQL*Net message from client"イベントが使用されるのです。 2つ目に、アイドル・イベントには、Oracle Supportにとって役立つような、セッション内部の他の状況に関する手がかりが示されることがあります。 そのため、これらの"アイドル"状態を示すEVENTの値を表示することをお勧めします。, リスト2には、記載された3つのセッションのパフォーマンスについて診断を行うための十分な情報が出力されています。 セッション4208はアイドル状態であるため、セッション4208の動作が遅いという苦情があっても、それはデータベース関連の遅延ではありません。 このセッションに関連するパフォーマンス問題は、無限ループに陥るようなコード内のバグや、アプリケーション・サーバー上の高いCPU使用率に関連するものです。 そのため、パフォーマンスのトラブルシューティングの照準をアプリケーション・クライアントに合わせることができます。, 一方、セッション3346の状況は異なります。 このセッションはまさに、アプリケーションにとってのボトルネックとなっています。 これまでに、行ロックを待っていることが、このセッションの動作が遅いと感じる原因であると分かりました。次に、論理的に考えれば、どのセッションがそのロックを保持しているのかという疑問がわきます。 お分かりかと思いますが、その答えはやはりV$SESSIONビューにあります。具体的に言えば、BLOCKING_SESSION列です (Oracle Real Application Clusters(Oracle RAC)環境では、ブロック中のセッションが別のインスタンスに属している場合があります。 その場合、ブロック中のインスタンスは、V$SESSIONビューのBLOCKING_INSTANCE列に表示されます)。, ブロック中のセッションおよびインスタンスは、次のSQL文を発行することで調査できます。, 出力結果から、SID 3346が待っているロックをSID 2832が保持していることが、はっきりと分かります。 これで、行の更新がブロックされているセッションと、その行に対するロックを保持しているセッションとの因果関係を辿れるようになりました。, ロックされている特定の行を確認するために、まずその行を含む表を把握します。 その表を把握するためにも、同じV$SESSIONビューを使用します。この例の場合、ROW_WAIT_OBJ#列にその情報があり、この列には、現在行がロックされている表のオブジェクト番号が示されます。 次に、このオブジェクト番号を使用して、DBA_OBJECTSビューからその表の名前を取得できます(リスト3を参照)。, 出力結果から、T1表のいずれかの行が行ロックの競合ポイントになっていることが分かります。 では、どの行がロックされているのでしょうか。 そのデータは、V$SESSIONビューの3つの列(ROW_WAIT_FILE#、ROW_WAIT_BLOCK#、ROW_WAIT_ROW#)で取得できます。その特定の行について、ROW_WAIT_FILE#は関連ファイルIDを、ROW_WAIT_BLOCK#はそのファイル内のブロックIDを示し、ROW_WAIT_ROW#はそのブロック内部の行のスロット番号を示します。 これらの情報を使用して、行のROWIDを特定できます。 ROWIDとは、Oracle Databaseインスタンス内部のすべての行に割り当てられた物理アドレスのことであり、行を一意に特定するために使用できます。, リスト4は、これまでに収集した情報を使用して、表からブロック中の特定の行を選択するためのSQLスクリプトです。 このスクリプトをrowinfo.sqlというファイル名で保存します。 このスクリプトは、次の入力値をこの順で受け取ります。 入力値は、所有者、表名、オブジェクト番号、ファイル番号、ブロック番号、行番号です。 このスクリプトを呼び出して、入力を求められたすべてのパラメータを渡します。リスト3の対応する出力結果をコピーして貼り付けることで、これらのパラメータを指定できます。, リスト4の出力結果から、ロックを要求中だが別のセッションによってロックされている特定の行が分かります。 これまでに、ロックしているセッションに加えて、ロック中の特定の行についても確認できました。, ところで、ロックを保持しているセッション(SID 2832)が何らかの理由でクライアントから切断される可能性はあるでしょうか。 このような状況は接続プール内で発生する可能性があります。あるいは、Oracle SQL Developerなどのシック・クライアント・ツールを使用してユーザーがデータベースにアクセスしている場合にも発生する可能性があります。 ロックを保持しているセッションを特定した後は、そのセッションでトランザクションのコミットかロールバックが実行されるまで待つこともできます。 このどちらのアクションでもロックが解放されます。, 接続に障害が発生した場合は、セッションの停止という方法も選択できます。セッションを停止するとロールバックが強制的に実行され、ブロック中のセッションで保持されているロックが解放されて、待機中のセッションが処理を再開できます。 また、問題が非常に単純である場合もあります。 たとえば、シック・クライアント・ツールからUPDATE文を発行したユーザーがコミットをし忘れたために、すべてのセッションがその更新対象の行を待っているような状況です。 そのようなブロック中のセッションを特定することで、そのユーザーに対して状況をただちに修正するように優しく注意できます。, 多くのトラブルシューティングにおいて、各セッションのSIDを把握するだけでは十分ではありません。 場合によっては、他の詳細情報も把握する必要があります。セッションの接続元のクライアント・マシン名、ユーザー名(データベースのユーザーとオペレーティング・システムのユーザーの両方)、サービス名などが該当します。 これらの情報はすべて、これまでと同じV$SESSIONビューで簡単に取得できます。 リスト5に示すスクリプトを実行して、これらの情報を表示する各列について簡単に確認しましょう。, OSUSER:接続中のクライアントのオペレーティング・システム・ユーザー名。 出力結果から、セッション4408がANLAPマシンから接続されており、このマシンにはWindowsユーザーのANANDAがログインしていることが分かります。, MACHINE:クライアントを実行しているマシン名。 データベース・サーバー自体を指す場合もあります。 2つのセッションで、マシン名が"prodb1"と示されています。 セッション4408は、ANLAPという別のマシン(おそらくはラップトップ)で実行されています。, TERMINAL:セッションがUNIXサーバーから接続されている場合の、実行中のターミナル。, LOGON_TIME:セッションが最初にOracle Databaseインスタンスに接続された日付。, リスト5に示された列を使用して、ユーザーのセッションに関する詳細情報を得ることができます。, ここで、appsvr1というアプリケーション・サーバーで実行中のアプリケーションでパフォーマンス問題が発生しているという苦情が来たとします。 リスト6は、そのマシンから接続しているセッションの情報を取得するための問合せ(V$SESSIONビューに対して実行)と出力結果です。問合せには、この記事のこれまでの問合せで使用した列が含まれています。, 出力結果から、appsvr1アプリケーション・サーバーより3つのセッションに接続していることが簡単に分かります。 すべてのセッションがSQL*Plusを実行しています(PROGRAM列を参照)。 SID 3346は現在動作中の唯一のセッションです(STATE列の"Working"より)。 動作中であるため、EVENT列にはセッションが最後に待機したときの情報が示されています。 この場合、セッションは現在待機中ではなく動作中であるため、待機時間に重要な意味はありません。 "Called secs ago"列(V$SESSIONの"last_call_et"を表す)には18と表示されています。この数値は、このセッションが18秒前にSQLコールを行ったことを表します。, 他の2つのセッションは待機中です。 SID 3089は行ロック待ちの状態です。 出力結果から、このセッションが146秒間待機中であること、および146秒前に最後のSQLコールを行っていることが分かります。 つまり、そのSQLコールを行ってからずっと、セッションがその特定のロックを待っていることになります。, 最後に、セッション2832も同様に待機中ですが、この場合の待機には"SQL*Net message from client"イベントが使用されています。つまり、アイドル状態であり、作業が割り当てられるのを待っています。 このセッションは152秒前に最後のSQL文を発行しており、151秒間アイドル状態を保っています。, これらの情報を用意すれば、パフォーマンス問題を正確に診断できます。 苦情を言ってきたユーザーには、次のように伝えることができます。appsvr1アプリケーション・サーバーから3つのセッションに接続しており、そのうちの1つはアイドル状態、1つは動作中、もう1つはロック待ちの状態です。 そのユーザーはおそらく、そのロック待ちのセッションの動作が遅いことについて問い合わせています。 この時点で、DBAはその原因と修正方法を把握しています。, パフォーマンス・チューニングに関する他の重要な情報に、現在セッションで実行中のSQL文に関する情報があります。このSQL文より、セッションの動作について詳しく考察できます。 これまでと同じV$SESSIONビューに、SQL文の情報も示されます。 V$SESSIONビューのSQL_ID列は、最後に実行されたSQL文のIDです。 SQL_ID値を使用して、そのSQL文のテキストをV$SQLビューから取得できます。 以下に、ユーザーが遅いと感じるセッションによって実行されたSQL文を特定する方法の一例を示します。, この記事では、遅延の原因として行レベル・ロックを取り上げてきました。 ロック関連の競合は非常によく起きる原因の1つですが、パフォーマンス問題の原因はこれだけではありません。 競合のおもな原因として、ディスクI/Oも挙げられます。 セッションでディスク上のデータベース・データファイルからデータを取得しバッファ・キャッシュに配置する際に、ディスクがデータを送信するまで待機する必要があります。 この待機については、以下のように、そのセッションのEVENT列に、"db file sequential read"(索引スキャンの場合)または"db file scattered read"(全表スキャンの場合)として表示されます。, このイベントが表示された場合は、ディスクからのI/Oが終了するまでセッションが待機中の状態です。 セッションの動作速度を上げるには、その待機時間を短縮する必要があります。 待機時間の短縮については、次のようないくつかの方法があります。, その他のオプションもありますが、これまでに説明した修正方法が一般的です。 実際に実施するアクティビティはそれぞれの状況によって異なりますが、1つ目の方法(SQL文によって取得されるブロック数の削減)は、ほぼどのような状況でも機能します。, ブロック数を削減するためのチューニングを検討する際には、SQL文でデータの選択を行っている表を確認できます。 しかし、SQL文で複数の表を使用している場合はどうすれば良いでしょうか。 どうすれば待機の原因となっている表を特定できるでしょうか。, 待機の原因となっている表を特定するには、やはりV$SESSIONビューを使用します。 ビューのP1列とP2列に、セッションが待っているセグメントに関する情報が表示されます。 リスト7は、P1およびP2の問合せと、その出力結果です。, Oracle Database 2日でパフォーマンス・チューニング・ガイド11g Release 2 (11.2), Oracle Databaseパフォーマンス・チューニング・ガイド11g Release 2 (11.2), P1列はファイルID、P2列はブロックIDです。 リスト7の出力結果にあるこれらの情報を使用して、DBA_EXTENTS内のエクステント情報からセグメント名を取得できます(以下を参照)。, 出力結果より、ARUPが所有しているT1表が、セッション内でディスクによって選択されていることが分かります。 この表に注目してチューニングする必要があります。 この表を高速ディスクに移動してI/Oを高速化できます。または、この表内のI/Oの高速化に重点を置いて、新しい索引の作成、マテリアライズド・ビューの作成、結果のキャッシュの増強など、この表に影響する変更を行うこともできます。, この記事では、成功するセッションのパフォーマンス・チューニングを始めるための以下の手順について説明しました。, この記事で紹介した方法により、DBAとして経験するパフォーマンス問題の約20%を解決できます。 Oracle Databaseは、内部の動作状況に関する情報を表示する機能を搭載しており、DBAは問題の本当の原因に照準を合わせることができます。DBAが行うべきことは調査だけです。, よく発生するけれども一見すると厄介なOracle Databaseのパフォーマンス問題は、適切な情報源を特定することで簡単に診断できます。この記事が、そのような診断を実現するためのお役に立てれば幸いです。 それでは、楽しいチューニングを。, Arup Nanda(arup@proligence.com)は、Oracle DBAとして16年以上の経験を持ち、パフォーマンス・チューニングからセキュリティや障害時リカバリまで、データベース管理のさまざまな分野に携わってきました。 2003年のOracle MagazineでDBA of the Yearに選ばれました。, 入力したキーワードの同義語を使用してください。たとえば、「ソフトウェア」の代わりに「アプリケーション」を試してみてください。, SQL文によって取得されるブロック数を削減します。 SQL文を調査し、索引を使用すべきときに全表スキャンを実行していないか、誤った索引を使用していないか、取得するデータ量を削減するように書き直せないかを検討します。, バッファ・キャッシュを増やすことで、拡張後のサイズで追加のブロックを格納し、I/Oの削減や待機時間の短縮を図れないかを検討します。, セッションが動作中か待機中かを確認します。 待機中の場合は、何をどの程度の時間待っているのかを明らかにします。, 待機状態の原因がロックの競合である場合は、ロックを保持しているセッションを特定して、そのセッションの詳細情報を取得します (ロックを保持しているセッションが孤立したセッションの場合は、そのセッションを停止してロックを解放できます)。, セッションがI/O待ちの状態の場合は、そのI/Oがどのセグメント(表、マテリアライズド・ビュー、索引など)を待っているのかを特定します。.