「バッファキャッシュ」関連の待機イベントと「パフォーマンス統計情報」を読み解く:しばちょう先生の試して納得! DBAへの道(改)(5)(2/2 ページ)
データベース技術や知識は、座学だけでなく「実際に手を動かして、実際に試して」理解を深めよう──。日本オラクルのデータベーススペシャリストが「新人をDBAに育てる際に使用する課題」をベースに、DBAがすぐ実践できる即効テクニックを紹介。今回は「バッファキャッシュ関連の待機イベントとパフォーマンス統計情報の読み解き方」を解説します。
演習2:実演習前の環境準備
以下のSQLを実行し、演習前の環境準備を実施してください。
$ sqlplus TRY/TRY SQL> /* TBS39表領域と、この表領域をデフォルト表領域とするTRYユーザーの作成 */ create tablespace TBS39 datafile '+DATA(DATAFILE)' size 512m ; create user TRY identified by TRY default tablespace TBS39 ; grant connect, resource, dba to TRY ; /* TAB39_SMALL表の作成 */ connect TRY/TRY create table TAB39_SMALL (COL1 number NOT NULL, COL2 char(1000)) ; /* TAB39_SMALL表へ8MB分のレコードを挿入 */ insert /*+append */ into TAB39_SMALL select LEVEL, 'hoge'||to_char(LEVEL) from DUAL connect by LEVEL <=7*128*7 ; commit ; /* TAB39_SMALL表のCOL1列に主キーを作成 */ create unique index IDX_TAB39_SMALL_COL1 on TAB39_SMALL(COL1) ; alter table TAB39_SMALL add primary key (COL1) using index ; /* TAB39_BIG表の作成 */ create table TAB39_BIG (COL1 number NOT NULL, COL2 char(1000)) ; /* TAB39_BIG表へ約200MB分のレコードを挿入 */ insert /*+append */ into TAB39_BIG select LEVEL, 'hoge'||to_char(LEVEL) from DUAL connect by LEVEL <=7*128*200 ; commit ; /* TAB39_BIG表のCOL1列に主キーを作成 */ create unique index IDX_TAB39_BIG_COL1 on TAB39_BIG(COL1) ; alter table TAB39_BIG add primary key (COL1) using index ; /* TAB39_BIG表のCOL2列にBツリーを作成 */ create index IDX_TAB39_BIG_COL2 on TAB39_BIG(COL2) ; /* TRYスキーマ内の全オブジェクトのサイズを確認 */ set linesize 120 pages 5000 col SEGMENT_NAME for a24 select SEGMENT_NAME, SEGMENT_TYPE, BYTES/1024/1024 from USER_SEGMENTS order by 2, 1 ; SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024 ------------------------ ------------------ --------------- IDX_TAB39_BIG_COL1 INDEX 4 IDX_TAB39_BIG_COL2 INDEX 208 IDX_TAB39_SMALL_COL1 INDEX .1875 TAB39_BIG TABLE 208 TAB39_SMALL TABLE 8 /* TRYスキーマ内の全オブジェクトのオプティマイザ統計情報を取得 */ exec DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'TRY');
ここでは、8MBの表「TAB39_SMALL」と208MBの表「TAB39_BIG」の2つの表を作成しています。各表には主キーを作成していますが、表TAB39_BIG側には主キー以外にもBツリー索引IDX_TAB39_BIG_COL2を作成していることだけを覚えておいてください。
ちなみに、このような検証用データを生成する際に役立つテクニックとして、LEVEL疑似列を使用したINSERT+SELECT文を使っています。こちらも参考にしてみてください。
演習3:「V$MYSTAT」ビューでパフォーマンス統計情報を確認する
「SYS」ユーザーでバッファキャッシュ上のデータブロックをフラッシュしたあと、「TRY」ユーザーにてTAB39_SMALL表に対してTABLE ACCESS FULLを行うクエリを実行し、「V$MYSTAT」に問い合わせます。
$ sqlplus /nolog SQL> /* テストの都合上、バッファキャッシュ上のデータをフラッシュ */ connect / as sysdba alter system flush buffer_cache ; /* クエリ実行 */ connect TRY/TRY set autotrace on explain select /*+FULL(t) */ sum(ora_hash(COL2, 10)) from TAB39_SMALL t ; SUM(ORA_HASH(COL2,10)) ---------------------- 31333 Execution Plan ---------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1001 | 253 (1)| 00:00:04 | | 1 | SORT AGGREGATE | | 1 | 1001 | | | | 2 | TABLE ACCESS FULL| TAB39_SMALL | 6272 | 6131K| 253 (1)| 00:00:04 | ---------------------------------------------------------------------------------- /* パフォーマンス統計情報の確認 */ set lines 150 pages 5000 col NAME for a48 select S.NAME, M.VALUE from V$MYSTAT M, V$STATNAME S where M.STATISTIC# = S.STATISTIC# and S.NAME like 'physical read%' order by 1 ; NAME VALUE ------------------------------------------------ ---------- physical read IO requests 39 physical read bytes 7421952 physical read flash cache hits 0 physical read partial requests 0 physical read requests optimized 0 physical read total IO requests 39 physical read total bytes 7421952 physical read total bytes optimized 0 physical read total multi block requests 13 physical reads 906 physical reads cache 906 physical reads direct 0 physical reads direct (lob) 0 physical reads direct temporary tablespace 0 physical reads for flashback new 0 physical reads prefetch warmup 0 physical reads retry corrupt 0
クエリ実行前に設定した「set autotrace on explain」によって出力された実行計画から、TAB39_SMALL表に対して「TABLE ACCESS FULL 」(= Table Full Scan)が実行されていることを確認できます。そして、このクエリを実行した際のデータブロックの物理読み込みを示す統計情報("physical read"で始まる統計)をV$MYSTATビューで確認しています。
ここでは、中でも特徴的な「physical reads」「physical reads cache」「physical read bytes」「physical read total multi block requests」の4つに限定して説明しておきましょう。詳細は「Oracle Database リファレンスマニュアル」を参照してください。
- physical reads:ディスクから読み込まれたデータブロックの合計数
- physical reads cache:ディスクからバッファキャッシュに読み取られたデータブロックの合計数
- physical read bytes:アプリケーションのアクティビティーのみによるディスク読取りの合計サイズ(バイト)
- physical read total multi block requests:1つの要求で2つ以上のデータベースブロックを読み取る要求の合計数
今回は「physical reads = 906」および「physical reads cache = 906」であることから、ディスクから読み込まれた906個のデータブロックは全てバッファキャッシュ上にキャッシュされたことを示しています。さらに、ブロックサイズが8KBの環境なので、906ブロックは7421952バイト(7MBと少々)で、統計情報physical read bytesの数に合致しますし、また、TAB39_SMALL表のセグメントサイズにも合います。
この他に、physical read total multi block requests統計情報が「13」へカウントアップしています。これは1回のI/O要求で複数ブロックをバッファキャッシュへ読み込んだマルチブロック読み込みが行われたことを意味しています。
実はこれが非常に大切です。Table Full Scanのように連続した大量データを読み込む時には、1つのブロック単位で連続に読み込むよりもディスク上に連続配置されている複数ブロックをまとめて読み込む方が効率的です。HDDの性能特性も考慮した理にかなったディスクアクセス方法です。
これは、『「Table Full Scan」をしたからこの統計情報がカウントアップした』ということなのですが、AWRレポートを読み説く際には逆に考えます。この統計情報がカウントアップしていたということは、「Table Full Scanのような連続した大量データの読み込みが行われた可能性がありそうだ」と推定するのですね。
次回は待機イベントの詳細を解説しつつ、より大きなTAB39_BIG表を使用してバッファキャッシュ関連の待機イベントやパフォーマンス統計情報の理解を深められる内容を展開します。それではまた次回お会いしましょう!
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の効率的な使い方をエッセンスにしてお伝えします。