Oracleで時間のかかるSQLクエリトップ5
Oracleでパフォーマンスの悪いSQLクエリを見つけるにはどうしたらよいですか?
Oracle は共有 SQL 領域の統計情報を保持しており、SQL 文字列ごとに 1 行が含まれています(v$sqlarea)。 しかし、その中のどれが悪いパフォーマンスなのか、どのように特定できるのでしょうか?
36
8
Oracleでパフォーマンスの悪いSQLクエリを見つけるにはどうしたらよいですか?
Oracle は共有 SQL 領域の統計情報を保持しており、SQL 文字列ごとに 1 行が含まれています(v$sqlarea)。 しかし、その中のどれが悪いパフォーマンスなのか、どのように特定できるのでしょうか?
私は、このSQLステートメントが役に立つと思いました(申し訳ありませんが、原著者に帰属させることはできません。)
これは、現在SQLキャッシュに格納されているSQL文のうち、経過時間順に上位のものを見つけるものです。 ステートメントは時間とともにキャッシュから消えていくので、昼間に出社したときに昨晩のバッチジョブを診断しようとしても無駄かもしれません。
また、disk_readsやexecutionsで並べることもできます。 貧弱なアプリケーションでは、同じ SQL 文を何度も送信してしまうことがあるので、実行回数は有用です。 このSQLは、バインド変数を正しく使っていることを前提にしています。
そして、ある文の
sql_id
とchild_number
を取り出して、この baby:- に送り込みます。これは、SQLキャッシュからの実際のプランと、SQLのフルテキストを表示します。
このようなものでディスク集約的なフルテーブルスキャンを見つけることができます。
インスタンスのアクティビティの期間中、実行ごとに取得する平均バッファを取得できます。
askTom-Oracleから入手した完全な情報。 それがあなたを助けることを願っています。
それはあなたが持っている神託のバージョンに依存します、9i以下Statspackはあなたが求めているものです、10g以上、あなたはawrを望みます、これらのツールは両方ともあなたに最高のsqlとたくさんを与えます他のもの。
次のクエリは、多数のディスク読み取りを実行するSQLステートメントを返します(問題のあるユーザーとクエリが実行された回数も含まれます)。
クエリをSYSとして実行し、過剰と見なされるものに応じてディスク読み取りの数を調整します(100,000は私にとっては機能します)。
最近、このクエリを使用して、ステートメントを実行する前に「プランの説明」を利用することを拒否するユーザーを追跡しました。
このクエリは古いOracle SQLチューニングブック(残念ながらもうありません)で見つかりました。申し訳ありませんが、帰属はありません。
この方法はいくつかありますが、tkprofでググってみてください。
GUIはありません...完全にコマンドラインなので、Oracle初心者にはちょっと怖いかもしれません。
このリンクは良いスタートとなりそうです。
http://www.oracleutilities.com/OSUtil/tkprof.html
検索していると、次のようなクエリがあり、1つの仮定で仕事をこなしています(クエリ実行時間 >6秒)。
SELECT ユーザー名、sql_text、sofar、totalwork、units
FROM v$sql,v$session_longops
WHERE sql_address = address AND sql_hash_value = hash_value
ORDER BY address, hash_value, child_number;
上記のクエリで、現在のユーザーの詳細がリストアップされると思います。
コメントをお待ちしています。