続・バッファキャッシュ関連の待機イベントとパフォーマンス統計情報を読み解く:しばちょう先生の試して納得! DBAへの道(改)(6)(1/4 ページ)
データベース技術や知識は、座学だけでなく「実際に手を動かして、実際に試して」理解を深めよう──。日本オラクルのデータベーススペシャリストが「新人をDBAに育てる際に使用する課題」をベースに、DBAがすぐ実践できる即効テクニックを紹介。今回は「バッファキャッシュ関連の待機イベントとパフォーマンス統計情報の読み解き方」について、前回に引き続き解説します。
皆さんこんにちは。日本オラクルの“しばちょう”こと、柴田長(しばたつかさ)です。
「データベースのパフォーマンス問題が発生しました!」そのような際に活躍するのがAWRレポートやStatspackレポートです。しかし、そこに絶妙なタッチで描かれている待機イベントやパフォーマンス統計情報の意味が分からなければ、問題を解決することはできません。
今回は前回の記事の続きで、バッファキャッシュ関連の待機イベントやパフォーマンス統計情報の読み解き方を体験してみましょう。使用するスキーマは前回作成したものを利用します。
1.SQL単体実行での待機イベントを確認する
「SYS」ユーザーでバッファキャッシュ上のデータブロックをフラッシュした後、「TRY」ユーザーにてevents 10046のSQLトレースを設定し、さらにその後、前回の演習3で実行したクエリ(TAB39_SMALL表に対してTABLE ACCESS FULLを行う)を再実行します。
$ sqlplus / as sysdba SQL> /* テストの都合上、バッファキャッシュ上のデータをフラッシュ */ alter system flush buffer_cache ; connect TRY/TRY /* このセッションでのみ、SQLトレースのイベントの有効化 */ alter session set events '10046 trace name context forever, level 12' ; /* クエリ実行*/ select /*+FULL(t) */ sum(ora_hash(COL2, 10)) from TAB39_SMALL t ; /* SQLトレースのイベントの無効化 */ alter session set events '10046 trace name context off' ; /* トレースファイル名の特定 */ SQL> !ps PID TTY TIME CMD 2221 pts/0 00:00:00 bash 3508 pts/0 00:00:00 sqlplus 3913 pts/0 00:00:00 ps SQL> !ps -ef | grep 3508 | grep "DESCRIPTION=" | grep -v grep oracle 3904 3508 0 15:07 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL... /* トレースファイルの確認 */ $ vi /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3904.trc ===================== PARSING IN CURSOR (省略) ... sqlid='fgsp4fbsnj738' select /*+FULL(t) */ sum(ora_hash(COL2, 10)) from TAB39_SMALL t END OF STMT PARSE (省略):c=1000,e=612,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1, ... EXEC (省略):c=0,e=327,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1, ... WAIT (省略): nam='db file sequential read' ela= 804 file#=5 block#=1154 blocks=1 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 560 file#=5 block#=1155 blocks=5 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 910 file#=5 block#=1160 blocks=8 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 1035 file#=5 block#=1169 blocks=7 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 1059 file#=5 block#=28449 blocks=7 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 1614 file#=5 block#=28456 blocks=8 obj#=15714 ... WAIT (省略): nam='db file scattered read' ela= 891 file#=5 block#=28465 blocks=7 obj#=15714 ... (以降、省略)
本来は、SQL監視レポートで待機イベントを取得できれば良かったのですが、実行時間が非常に短くてサンプリングされなかったため、より正確に待機イベントの発生状況を確認することが可能な、events 10046のSQLトレースを使用してみました。掲載しておいてなんですが、私も基本的には、いざという時にしか使用しませんし、SQL監視レポートで代用できますからおすすめしていません。興味のある方は、My Oracle Supportで使い方、読み方を学習して、自己責任で使用してくださいね。
Event 10046のSQLトレースが出力されるトレースファイルは、アラートログファイルと同一のディレクトリ内にありますが、このディレクトリには拡張子「.trc」のファイルが数多く存在しているため、特定することが少し難しいです。生成された時刻で特定しても良いですし、ファイル名に含まれている数字から特定することも可能です。この数字はSQLトレースを出力したサーバプロセスのプロセスIDを意味していますので、SQLトレースを取得したsqlplusからフォークされたサーバープロセスの、プロセスID(上述の回答例では3904)を調べることで特定しています。ぜひ参考にしてみてください。
取得されたトレースを確認してみると、1回の「db file sequential read」待機イベントが発生した後、「db file scattered read」待機イベントが連続して発生していることが確認できます。とても面白いですね。各行の待機イベントには「blocks」という記載がありますが、これが「1」の場合にはシングルブロック読み込み、「2以上」の場合にはマルチブロック読み込みを意味しますから、「db file sequential read待機イベントはシングルブロック読み込み時に発生し、db file scattered read待機イベントはマルチブロック読み込み時に発生する」と理解できますね。
さらに、次の演習でも解説させていただきますが、どちらの待機イベントも「バッファキャッシュ上へのブロック読込み時」に発生することを、合わせて覚えておきましょう。勘の良い方は気付かれていると思うので書いておきますが、「ディスクからブロックを読み込むが、バッファキャッシュ上への読み込みでなければ別の待機イベントになる」ことも意味していますね。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 【Oracle Database】忘れていませんか? 「アラートログ調査」に必要な、たった3つのキホン
データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は基本編として「アラートログの調査で押さえるべき3つのポイント」を解説します。【Oracle Database 12c対応版】 - 障害発生! 問題切り分けはスピード勝負
Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局) - パフォーマンス向上の最短コースを知る
本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局) - SQL実践講座
SQLは、データを操作するために非常に簡単な構文で構成されているように見えます。ところが実際に使い込んでいくと、一見簡単に取得できるように見えるデータが取得できない場面にぶち当たることもあります。こういった場面のために、SQLの効率的な使い方をエッセンスにしてお伝えします。