4

Oracle で作成したクエリのパフォーマンスを理解しようとしています。現時点では、SQLDeveloper とその実行タイマーにしかアクセスできません。SHOW PLAN は実行できますが、自動トレース機能が使用できません。

作成したクエリは、SQLDeveloper で「クエリの実行」(F9) を押すと、約 1.8 秒で実行されます。これがデフォルトで最初の 50 行のみをフェッチしていることはわかっていますが、少なくとも 1.8 秒には、合計実行時間と最初の 50 行をクライアントに配信する時間を含めることができるでしょうか?

このクエリをストアド プロシージャでラップし (OUT REF CURSOR を介して結果を返す)、外部アプリケーション (SQL Server Reporting Services) から使用しようとすると、クエリの実行に 1 分以上かかります。SQLDeveloper で「スクリプトの実行」(F5) を押すと、同様のパフォーマンスが得られます。ここでの違いは、これら 2 つのシナリオでは、Oracle が最初の 50 行ではなく、すべての行を送り返す必要があることです。これにより、クライアント PC と Oracle インスタンスの間にネットワーク接続の問題があると思われます。

私のクエリは約 8000 行しか返さないため、このパフォーマンスは驚くべきものです。レイテンシに関する上記の理論を証明するために、SQLDeveloper で次のようなコードを実行しました。

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

...そして、これは約 2 秒で実行されます。繰り返しますが、SQLDeveloper の実行クロックはクエリの実行時間を正確に示していますか? または、何か不足していますか?実際にチューニングが必要なのは私のクエリである可能性はありますか?

私が利用できる限られたツールに基づいて、誰かがこれについての洞察を提供してもらえますか? それとも、DBA に追加の分析を依頼する必要がありますか?

4

1 に答える 1

4

「これがデフォルトで最初の 50 行のみをフェッチしていることはわかっていますが、少なくとも 1.8 秒には、合計実行時間と最初の 50 行をクライアントに配信する時間を含めることができるでしょうか?」

いいえ、最初の 50 行を返すときです。データベースが結果セット全体を決定する必要は必ずしもありません。

表を百科事典と考えてください。名前が「A」または「Z」で始まる動物のリストが必要な場合は、ツチブタとアリゲーターがすぐに見つかるでしょう。本全体を読まなければならないので、シマウマを手に入れるにはもっと時間がかかります。クエリがテーブル全体のスキャンを実行している場合、最初の章の後にピックアップするものがない場合でも、テーブル全体 (または本) を読み取るまで完了しません (そこを認識していないため)。それがそれを読むまで、そこには何も重要ではありません)。

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

このコードは何もしません。より具体的には、クエリを解析して、必要なテーブル、列、および権限が配置されていることを確認します。実際にクエリを実行したり、フィルター基準を満たす行があるかどうかを判断したりすることはありません。

クエリが 8000 行しか返さない場合、ネットワークに重大な問題がある可能性は低いです (非常に大きな行でない限り)。

DBA にパフォーマンス チューニングの簡単なチュートリアルを依頼してください。

于 2009-12-22T03:59:42.003 に答える