** 遅い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;