私はOracle DBの初心者です。クエリの実行時間を知りたい。このクエリは約20,000レコードを返します。 SQL Developerを見ると、50行しか表示されておらず、最大500まで調整できます。また、F5を使用して最大5000です。
アプリケーションに変更を加えることで完了したはずですが、本番環境で実行されているため、アプリケーションの再デプロイメントはできません。したがって、私はSQL Developerのみを使用することに制限されています。クエリの実行に費やされた秒数を取得する方法がわかりませんか?これに関するアイデアは私を助けます。ありがとうございました。
よろしく、JE
最初に返された50行を超えて下にスクロールすると、さらにフェッチされます。それらすべてが必要なときは、50の最初の1つをクリックしてから、 CtrlEnd 一番下までスクロールします。
これにより、使用された時間の表示が更新され(結果のすぐ上に「All Rows Fetched:20000 in 3.606 seconds」のようなメッセージが表示されます)、クエリ全体の正確な時間がわかります。
ステートメントがすでにデプロイされているアプリケーションの一部であり、ビューにアクセスする権限がある場合 V$SQLAREA
の場合、EXECUTIONS
とCPU_TIME
の数を確認できます。 SQL_TEXT
を使用してステートメントを検索できます。
SELECT CPU_TIME, EXECUTIONS
FROM V$SQLAREA
WHERE UPPER (SQL_TEXT) LIKE 'SELECT ... FROM ... %';
これは、実際の実行時間を決定する最も正確な方法です。ビュー V$SESSION_LONGOPS
も興味深いかもしれません。
これらのビューにアクセスできない場合は、すべてのレコードを実行するためにカーソルループを使用することもできます。
CREATE OR REPLACE PROCEDURE speedtest AS
count number;
cursor c_cursor is
SELECT ...;
BEGIN
-- fetch start time stamp here
count := 0;
FOR rec in c_cursor
LOOP
count := count +1;
END LOOP;
-- fetch end time stamp here
END;
アーキテクチャによっては、SQLが実行されているシステムにデータを送信する必要があるため、これは多少正確になる場合があります。
これらの制限を変更できます。ただし、DBとクライアントの間のデータ転送、および場合によっては表示にある程度の時間を使用します。そして、それは各フェッチによってプルされる行の数によって影響を受けます。ただし、これらのことはアプリケーションにも影響を与えるため、未処理の実行時間を見ても、とにかく全体像がわからない場合があります。
ワークシート(F5)の制限を変更するには、[ツール]-> [設定]-> [データベース]-> [ワークシート]に移動し、[スクリプトで印刷する最大行数]の値(および[スクリプト出力の最大行数])を増やします。フェッチサイズを変更するには、環境設定の[データベース]-> [詳細]パネルに移動します。おそらくアプリケーションの値と一致させるためです。
これは完璧ではありませんが、実際のデータを表示したくない場合は、DBでの実行にかかる時間を取得するだけで、クエリをラップして単一の行を取得できます。
select count(*) from (
<your original query
);
通常、元のクエリ全体を実行してから結果をカウントしますが、時間に大きな影響はありません。 (私が想定しているように、クエリを内部的に書き換える可能性はありますが、そうなる可能性は低いと思います。必要に応じて、ヒントを使用して回避することもできます)。