t-sqlクエリの実行にかかる時間を測定する


156

SqlServer 2005を使用する2つのt-sqlクエリがあります。各クエリの実行にかかる時間を測定するにはどうすればよいですか?

私のストップウォッチを使用してもそれは切れません。


2
Sql Server Management Studioを使用していますか?通常、2番目の解像度でのみですが、各クエリの経過時間を表示します。:また、この関連の質問を参照stackoverflow.com/questions/8247587/...
mellamokb

回答:


174

イベント間の「経過時間」を測定する単純なアプローチの1つは、現在の日付と時刻を取得することです。

SQL Server Management Studio

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 

経過時間を計算するには、これらの日付値を変数に取り込み、DATEDIFF関数を使用します。

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT /* query one */ 1 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

SET @t1 = GETDATE();
SELECT /* query two */ 2 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

これは1つの方法にすぎません。SQLプロファイラを使用して、クエリの経過時間を取得することもできます。


これを行う方法についてSql Profilerのドキュメントを探しましたが、何時間も読む必要のないドキュメントを見つけることができませんでした。「Profiler for Dummies」リンクをお勧めできますか?
TheMoot

@TheMoot遅れていることはわかっていますが、MSDNリンクは「[Subject] for Dummies」のニーズに最適です:)。これを見てみてください方法を:SQLプロファイラーの使用
John Odom

他の誰かがこれをSQL管理スタジオで使用することで問題がありましたか?テスト用のストアドプロシージャの約15のクエリのセットに追加しましたが、実行に時間がかかりすぎます。私は7分でキャンセルし、合計されたタイマーはすべて約2分でした。だから私はいくつかのリターンテキストキャッシュの問題があると思います、あるいは多すぎるのですべての日付差分を計算するのに時間がかかりすぎるかもしれません。
MH

2
@Hanoncs:GETDATE()を評価して結果を変数に割り当てるために使用される短い時間と、DATEDIFF()を評価して結果を返すために使用される短い時間があります。私が提案した単純なアプローチは、シングルトンクエリの大まかな測定値を取得することでした。ストアドプロシージャのタイトループ内でこのアプローチを使用することはお勧めしません。ストアドプロシージャに一連のクエリがある場合、このアプローチを使用して、いくつかの賢明なポイントにデバッグ出力を追加し、識別子列を追加して、プロシージャのどの行がどの結果を出力したかを知ることができます。
spencer7593 2017

1
私は通常SET @t1 = GETDATE();、クエリの上部に貼り付けSET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();てから、クエリ内の適切な場所に貼り付けます(「注1」を適切に編集します)。選択を測定値ではなくブレークポイントとして扱うことは、意味的にはアプローチと同じです(ただし、@ t1への最終的な設定は偽であり、これはすべてのクエリを測定する必要があることを前提としています)。これは純粋にメンタル/タイピングの最適化です(クエリごとに2つの貼り付けではなく、ブレークポイントごとに1つの貼り付け)。
ブライアン

251

上記の答えよりも正確な測定が必要な場合:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

結果は「メッセージ」ウィンドウに表示されます。

アップデート(2015-07-29):

よくあるリクエストにより、ストアドプロシージャのコンポーネントではなく、全体の実行時間を測定するために使用できるコードスニペットを作成しました。これは、最後の実行にかかった時間のみを返しますが、それによって返される追加の統計sys.dm_exec_procedure_statsも価値がある場合があります。

-- Use the last_elapsed_time from sys.dm_exec_procedure_stats
-- to time an entire stored procedure.

-- Set the following variables to the name of the stored proc
-- for which which you would like run duration info
DECLARE @DbName NVARCHAR(128);
DECLARE @SchemaName SYSNAME;
DECLARE @ProcName SYSNAME=N'TestProc';

SELECT CONVERT(TIME(3),DATEADD(ms,ROUND(last_elapsed_time/1000.0,0),0)) 
       AS LastExecutionTime
FROM sys.dm_exec_procedure_stats
WHERE OBJECT_NAME(object_id,database_id)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)

2
データベースへのアクセスが読み取り専用の場合、この関数は使用できないことに注意してください。 To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. from:technet.microsoft.com/en-us/library/ms190287.aspx
Rob

5
ストアドプロシージャを実行する必要がある時間を常に確認できる方法はありますか?現在、単一の測定値が多数表示されています。
Rookian 2013年

2
@Rookian、私はあなたがそれを手助けするために答えにいくつかのコードを追加しました。
Michael Goldshteyn 2015


11

別の方法は、メニュー>クエリ>クライアント統計を含めるClient Statisticsからアクセスできるという名前のSQL Server組み込み機能を使用することですです。

個別のクエリウィンドウで各クエリを実行し、Client Statisticsタブのすぐ横にあるMessagesタブに表示される結果を比較できます。

たとえば、下の画像の例では、私のクエリの1つに対するサーバー応答を取得するために経過した平均時間が39ミリ秒であることを示しています。

結果

実行時間を取得するための3つの方法すべてをここで読むことができますEstimated Execution Plan ctrlLクエリについてさらに調査するために、表示する必要がある場合もあります。


7

さらに良いことに、これはクエリのn回の反復の平均を測定します。より正確な読み取りに最適です。

declare @tTOTAL int = 0
declare @i integer = 0
declare @itrs integer = 100

while @i < @itrs
begin
declare @t0 datetime = GETDATE()

--your query here

declare @t1 datetime = GETDATE()

set @tTotal = @tTotal + DATEDIFF(MICROSECOND,@t0,@t1)

set @i = @i + 1
end

select @tTotal/@itrs

4
私は変更MICROSECONDMILLISECOND、キャッシュ毎回私はライン間の次に挿入クリアするbegindeclare @t0 ...:をCHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;。魅力的な作品で、まさに私が探していたものです。+1
ダニエルZ.

1
私はyrスニペットを使用して、ストアドプロシージャの増分パフォーマンスの微調整を測定しています。
ジェイジェイ2017

あなたがた両方に感謝します。私は長い間SQLを行ってきましたが、その風変わりな言語です。しかし、キンクが何であるか、そしてそれらを有利にスピンさせる方法を知ったら、それは多くのXDに役立ちます
HumbleWebDev

3

統計アイコンをクリックして表示し、クエリを実行してタイミングを取得し、クエリの効率を把握します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.