.net SqlCommand.ExecuteReader持续时间小于SQL探查器批处理持续时间

.net SqlCommand.ExecuteReader持续时间小于SQL探查器批处理持续时间,.net,sql-server,duration,executereader,.net,Sql Server,Duration,Executereader,调用SqlCommand.ExecuteReader所需的时间如何比SQL事件探查器中的SQL批处理本身所需的时间少 我在控制台应用程序中运行了以下简单代码,该应用程序调用SqlCommand.ExecuteReader,我使用秒表对象计时: var swQueryTime = new Stopwatch(); var conn = new SqlConnection("Data Source=.;Initial Catalog=master;Trusted_Connectio

调用SqlCommand.ExecuteReader所需的时间如何比SQL事件探查器中的SQL批处理本身所需的时间少

我在控制台应用程序中运行了以下简单代码,该应用程序调用SqlCommand.ExecuteReader,我使用秒表对象计时:

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;
        }
var swQueryTime=new Stopwatch();
var conn=new-SqlConnection(“数据源=;初始目录=主目录;可信连接=真;”);
conn.Open();
string sql=string.Format(@“选择*来自sys.dm_os_memory_clerks;选择*来自sys.dm_os_performance_counters”);
对于(int i=0;i<10;i++)
{                
var comm=新的SqlCommand(sql,conn);
swQueryTime.Restart();
var dr=comm.ExecuteReader();
swQueryTime.Stop();
WriteLine(“elapsedmillesons:{0}”,swQueryTime.elapsedmillesons);
Close博士();
comm=null;
}
SQL批处理持续时间平均比.Net端报告的时间长4倍

我已经检查过探查器是否专门报告毫秒

我没有使用SqlCommand.ExecuteReader的异步版本

探查器持续时间不是我使用探查器开始和结束时间读取和验证的多个线程/内核的所有时间的总和


感谢您的创意。

因为您只知道批量开始的时间。如果您也使用这些数据,那么时间可能会排成一行:

using(var dr = comm.ExecuteReader()) {
    do {
        while(dr.Read()) {}
    } while (dr.NextResult());
}

顺便说一句,还有一些
SET
选项可以更改某些查询的性能-不确定是否应在此处应用,但它会显著影响具有计算+持久值的表:如果
SET
值与创建列时的设置不兼容,它需要每行重新运行计算。对于计算+持久化+索引列,如果要对该列进行筛选,这一点尤其明显-它必须进行表扫描(或类似操作),而不是索引扫描/索引查找。

+1:检查Sql探查器的时间为毫秒/微秒。您是否在探查器中检查了Sql语句本身的持续时间?它总是比批处理持续时间小一些,通常差异很小,但有时差异很大。是的,我检查了语句持续时间-这两条语句和预期的批处理持续时间相加。是的,这使探查器和ExecuteReader在计时上达成一致-谢谢!我在ExecuteReader上的阅读让我相信它等待所有数据返回,然后再继续下一条语句-你知道这种替代行为是否在任何地方都有记录吗?@user2139987我没有检查,但基本上它返回TDS,这是一个流-你可以在流结束之前很久开始读取数据。当然,当使用
SequentialAccess
模式时,情况就是如此,因为它甚至将单个列作为流读取。如果您尝试在数据结束之前访问'out`/
ref
参数,您还可以看到此流行为的副作用-这些参数是最后返回的。您还可以在长时间选择之后引发sql错误—如果在结束之前关闭读取器,您可能永远看不到错误。