** 遅いSQLを特定する [#ga380fbb]

#setlinebreak(on);

 http://www.atmarkit.co.jp/fdb/rensai/orasql04/orasql04_1.html

-チューニング対象SQL
--1実行当たりの実行時間が長いSQL
--ディスク読み取りブロック数が多いSQL
--バッファの読み取り数が極端に多いSQL
--実行回数が極端に多いSQL

-対象SQLの洗い出し
--動的パフォーマンスビューを使用したSQLの洗い出し
 [デメリット]
  ・1回当たりの実行時間などは平均値しか取得できない
  ・メモリ上にキャッシュされているSQLの情報しか確認できない

|ビュー名|主な格納情報|主な列名|列値の意味|h
|V$SQL|・SQLの先頭1000bytes&br;・SQLの累積リソース使用状況|SQL_TEXT|SQLの先頭1000bytes|
|~|~|SORTS|SORTの回数|
|~|~|FETCHES|FETCHの回数|
|~|~|EXECUTIONS|実行回数|
|~|~|USERS_EXECUTING|現在実行中のユーザー数|
|~|~|PARSE_CALLS|解析コールの回数|
|~|~|DISK_READS|ディスク読み込み数|
|~|~|BUFFER_GETS|バッファ読み込み数|
|~|~|ROWS_PROCESSED|SQLが戻す行数|
|~|~|CPU_TIME|処理に使用したCPU時間(マイクロ秒)|
|~|~|ELAPSED_TIME|処理に使用した経過時間(マイクロ秒)|
|~|~|ADDRESS|ほかのViewとの結合に使用|
|~|~|HASH_VALUE|ほかのViewとの結合に使用|
|V$SQL_TEXT|・SQLの全文|SQL_TEXT|64bytes単位で分割されたSQL|
|~|~|PIECE|分割されたSQLの断片番号|
|~|~|ADDRESS|ほかのViewとの結合に使用|
|~|~|HASH_VALUE|ほかのViewとの結合に使用|
|V$SQL_PLAN|・SQLの実行計画|OBJECT_NAME|実行計画中の表、索引名|
|~|~|OPERATION|実行計画オペレーション|
|~|~|OPTIONS|実行計画オペレーションのオプション|
|~|~|OPTIMIZER|オプティマイザのモード|
|~|~|DEPTH|実行計画のTreeの深さ|
|~|~|ADDRESS|ほかのViewとの結合に使用|
|~|~|HASH_VALUE|ほかのViewとの結合に使用|
 

 -- 合計実行時間の長いSQL
 SET LINES 140
 COL sql_text            FORM A140
 COL buffer_per_run      FORM 999999999999
 COL disk_per_run        FORM 999999999999
 COL cpu_time            FORM 999999999999
 COL elapsed_time        FORM 999999999999
 SELECT * FROM
 (SELECT
         sql_text,address,hash_value,parse_calls,executions,
         buffer_gets,disk_reads,
         buffer_gets/executions buffer_per_run,
         disk_reads/executions disk_per_run,cpu_time,
         elapsed_time
 FROM v$sql
 WHERE executions>0
 ORDER BY elapsed_time desc)   -- この条件を変更する
 WHERE rownum <= 10;           -- 表示件数はこの値を変更する
 
 1回の実行当たりの秒数 = ELAPSED_TIME / EXECUTIONS となる

 -- バッファ読み込みブロック数が多いSQL
 -- ※大量のバッファ読み込みを行っているSQLは、適切でない索引や、
 --  連結索引の一部を使用している可能性がある。
 
 先のSQLのORDER BY に buffer_gets を指定する

 -- ディスク読み込みブロック数が多いSQL
 -- ※ディスク読み込みが多発している場合、効率の悪い索引を使用している、
 --  もしくは全表スキャンを行っている可能性が考えられます。
 --  ディスクI/Oは、メモリI/Oと比べて大幅に処理速度が劣るため、
 --  チューニングによりディスクI/Oを減らすことができないか検討します。
 
 先のSQLのORDER BY に disk_reads を指定する

 -- 実行回数の多いSQL
 
 先のSQLのORDER BY に executions を指定する

 -- SQL全文の取得方法
 -- 初めに、V$SQLからADDRESS列、HASH_VALUE列の値を確認し、下記のSQLを実行
 
 set pages 100 feed off timing off echo off lines 140
 SELECT sql_text
   FROM v$sqltext
  WHERE hash_value=V$SQLから取得したHASH_VALUE値
    AND address='V$SQLから取得したADDRESS値'
  ORDER BY piece;


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS