SQL プロファイラーで見られるように、SqlCommand.ExecuteReader への呼び出しは、SQL バッチ自体よりも完了するのに時間がかかるのはなぜですか?
SqlCommand.ExecuteReader を呼び出すコンソール アプリで次の単純なコードを実行しています。これには、Stopwatch オブジェクトを使用しています。
var swQueryTime = new Stopwatch();
var conn = new SqlConnection("Data Source=.;Initial Catalog=master;Trusted_Connection=True;");
conn.Open();
string sql = string.Format(@"select * from sys.dm_os_memory_clerks; select * from sys.dm_os_performance_counters ");
for (int i = 0; i < 10; i++)
{
var comm = new SqlCommand(sql, conn);
swQueryTime.Restart();
var dr = comm.ExecuteReader();
swQueryTime.Stop();
Console.WriteLine("ElapsedMilliseconds: {0}", swQueryTime.ElapsedMilliseconds);
dr.Close();
comm = null;
}
平均して、SQL バッチの所要時間は、.Net 側で報告される時間の 4 倍です。
プロファイラーが具体的にミリ秒を報告していることを確認しました。
私は SqlCommand.ExecuteReader の非同期バージョンを使用していません。
プロファイラーの期間は、プロファイラーの開始時間と終了時間を使用して読んで検証したものから、複数のスレッド/コアにわたるすべての時間の合計ではありません。
アイデアを歓迎します。