Q: Oracle 10g でクエリのパフォーマンスを客観的に測定する良い方法はありますか?
- Oracle トレースは、パフォーマンスを測定する最良の方法です。クエリを実行し、Oracle に実行を計測させます。SQLPlus 環境では、AUTOTRACE を使用するのは非常に簡単です。
http://asktom.oracle.com/tkyte/article1/autotrace.html (記事移動)
http://tkyte.blogspot.com/2007/04/when-explanation-doesn-sound-quite.html
http:// asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5671636641855
また、他の環境で Oracle トレースを有効にすることはそれほど難しくありません。
Q:数日間チューニングしてきた特定のクエリが 1 つあります。(少なくとも最初のテストに基づくと)より高速に動作しているように見えるバージョンを入手しましたが、EXPLAIN のコストはほぼ同じです。
- ステートメントの実際の実行は、測定する必要があるものです。EXPLAIN PLAN は、オプティマイザーの計画を予測するという適切な仕事をしますが、実際にパフォーマンスを測定するわけではありません。
Q: > 1 . EXPLAIN コストに何かが欠けている可能性はどれくらいありますか?
- 可能性は高くありませんが、EXPLAIN PLAN がオプティマイザーとは異なる計画を提示するケースを見てきました。
Q: > 2 . EXPLAIN のコストがクエリの実際のパフォーマンスと著しく異なる特定の状況はありますか?
- 短い答えは、私は何も観察していないということです。しかし、繰り返しになりますが、EXPLAIN PLAN のコストと実際に観察されたパフォーマンスとの間に直接的な相関関係はありません。EXPLAIN PLAN のコストが非常に高くなる可能性がありますが、実際のクエリは 1 秒未満で実行されます。EXPLAIN PLAN はクエリの実際のパフォーマンスを測定しません。そのため、Oracle トレースが必要です。
Q: > 3 . このクエリでは first_rows ヒントを使用しました。これは影響がありますか?
- 任意のヒント ( など
/*+ FIRST_ROWS */
) は、オプティマイザーによって選択されるプランに影響を与える可能性があります。
EXPLAIN PLAN によって返される「コスト」は相対的です。これはパフォーマンスの指標ですが、正確な指標ではありません。コストの数値を、ディスク操作の数、CPU 秒数、または待機イベントの数に変換することはできません。
通常、EXPLAIN PLAN コストが 1 と表示されているステートメントは「非常に速く」実行され、EXPLAIN PLAN コストが 5 ~ 6 桁程度のステートメントは実行に時間がかかります。しかしいつもではない。
オプティマイザーが行っているのは、考えられる多くの実行プラン (全テーブル スキャン、インデックスの使用、ネストされたループ結合など) を比較することです。オプティマイザーは、各プランに番号を割り当ててから、番号が最も小さいプランを選択します。
EXPLAIN PLAN によって示されるオプティマイザ プランが、ステートメントの実行時に使用される実際のプランと一致しないケースを見てきました。10 年前の Oracle8 で、特に文にリテラルではなくバインド変数が含まれる場合に、それを見ました。
ステートメント実行の実際のコストを取得するには、ステートメントのトレースをオンにします。これを行う最も簡単な方法は、SQLPlus AUTOTRACE を使用することです。
[http://asktom.oracle.com/tkyte/article1/autotrace.html][4]
SQLPlus 環境の外では、Oracle トレースをオンにすることができます。
セッション セット timed_statistics = true を変更します。
セッション セット tracefile_identifier = here_is_my_session を変更します。
セッション セット イベント '10046 トレース名コンテキストを永久に変更、レベル 12'
--alter session set events '10053 trace name context forever, level 1'
select /*-- your_statement_here --*/ ...
セッション セット イベント '10046 トレース名コンテキスト オフ' を変更します。
--alter session set events '10053 trace name context off'
これにより、トレース ファイルがサーバーの user_dump_dest ディレクトリに配置されます。作成されたトレース ファイルには、ステートメント計画とすべての待機イベントが含まれます。(割り当てられたトレースファイル識別子はファイル名に含まれ、udump ディレクトリでファイルを見つけやすくなります)
'user_dump_dest' のような名前の v$parameter から値を選択します
tracefile にアクセスできない場合は、データベース管理者にアクセスしてもらう必要があります。(dba は、開発者が .trc ファイルに対して実行して tkprof を実行できる単純なシェル スクリプトを作成し、トレース ファイルと tkprof 出力のアクセス許可を変更できます。また、新しい trcanlzr を使用することもできます。両方。