SQLのパフォーマンスを改善したい

負荷の高い SQL は該当処理のレスポンスが遅いだけでなく、リソース消費によって
Oracle データベース全体のパフォーマンス低下の要因となる場合がある。よって、
負荷をかけている SQL を特定しておき、必要に応じてチューニングを行うべきである。

チューニングの流れ

まず対象の SQL を特定しトレースを取得する。

実行計画を元に SQL の改善やインデックス作成等の対処を行い、
処理コストを確認しながら、目標値に達するまで繰り返し行う。

既に最適化されている場合、パフォーマンスの向上が困難であることも多い。
チューニングはある意味終わりのない作業であるため、必ず目標値を設定する。

負荷の高い上位 SQL

上位 SQL の確認としては、以下のような観点が考えられる。

・実行時間( CPU時間 /経過時間)が長い
・バッファ読取りが多い(= CPU 使用率が高い)
・ディスク読取りが多い(= I/O 使用率が高い)
・解析コール数が多い
・ソートが多い
・待機時間が長い
・実行回数が多い

解析対象のv$ビュー

これらの情報を取得する場合、v$ からはじまる動的パフォーマンスビューを参照する。

一次切り分けとしては、 v$sql や v$sqlstats を主に利用するが、
その他に v$sqlarea v$sysstat v$sqltext v$sql_plan なども必要となることがある。

しかし、これらで特定した SQL に必ず問題点があるとは限らない。
例えば大量データ取得や複雑な結合処理では、最適化されていて
コストが妥当でも、結果として上位となる可能性があるため。

逆に上位に表示されていなくても、アクセスしたブロック数のわりに選択行が少ない SQL や、
読取りブロックのわりに実行時間が長い SQL などに改善の余地が潜んでいる可能性もある。

関連記事