代わりに挿入トリガーを持つ挿入ステートメントの実行時間を (SQL Server プロファイラーから推測した期間を使用して) 測定したいと考えています。トリガー時間を含むこのステートメントの完全な時間を測定するにはどうすればよいですか?
1 に答える
クエリの SQL サーバー プロファイラーに表示される実行時間 (期間) は、トリガーやその他の制約の評価を含め、そのクエリの実行にかかった時間です。
トリガーは、データの整合性をチェックする別の方法として使用することを目的としているため、SQL ステートメントは、いずれかのトリガーも完了するまで完了したとは見なされません。
更新:一般的に使用される SQL Server プロファイラー イベントの概要:
SQL:BatchCompleted SQL サーバー バッチ (ステートメントのグループ) の実行が完了したときに発生します。期間は、バッチを実行する合計時間です。
SQL:StmtCompletedバッチの一部として実行された SQL ステートメントの実行が完了すると発生します - 継続時間は、その単一のステートメントを実行する時間です。
SP:Completedストアド プロシージャの実行が完了したときに発生します。表示される期間は、ストアド プロシージャの実行が完了するまでの時間です。
SP:StmtCompletedストアド プロシージャの一部として実行された SQL ステートメントが完了すると発生します。
バッチはステートメントで区切られた一連の SQL ステートメントGO
ですが、上記を理解するには、すべての SQL サーバー コマンドがバッチのコンテキストで実行されることも知っておく必要があります*。
また、上記の各イベントには、対応するStarting
イベント ( SP:Starting
、SQL:BatchStarting
、SQL:StmtStarting
および) もありSP:StmtCompleted
ます。これらには期間がリストされていません (完了していないため期間はまだわかりませんが、期間の記録がいつ開始されるかを示すのに役立ちます)。
これらのイベント間の関係をよりよく理解するために、(SQL Server Management Studio 内から) いくつかの単純な例のトレースをキャプチャして実験することをお勧めします。次に例を示します。
SELECT * FROM SomeTable
GO
SELECT * FROM SomeTable
SELECT * FROM OtherTable
GO
SELECT * FROM SomeTable
exec SomeProc
GO
ご覧のとおり、上記の 3 つの例のそれぞれについて、常に と が得られますがSQL:BatchStarting
、SQL:BatchCompleted
他のイベント タイプでは、個々のコマンドの実行に関する詳細が提供されます。
このため、私は一般的にSQL:BatchCompleted
イベントを最もよく使用する傾向がありますが、測定しようとしているステートメントがより大きなバッチの一部として (またはストアド プロシージャで) 実行される場合は、他のイベント クラスのいずれかが役立つことがあります。
さまざまな SQL Server プロファイリング イベントの詳細については、 TSQL イベント カテゴリ (MSDN)を参照してください。
最後に、SQL Server Management Studio 内からこのコマンドを実行している場合、実行時間を記録する最も簡単な方法は、クライアント側の統計機能を使用することであることに注意してください。
(*) すべてがバッチの一部として実行されることは確かですが、これを確認する証拠をインターネット上で見つけることはできませんでした。