SQL Server、ADO.NET和LINQ to SQL中查询的性能比较

SQL Server、ADO.NET和LINQ to SQL中查询的性能比较,sql,sql-server,performance,linq-to-sql,ado.net,Sql,Sql Server,Performance,Linq To Sql,Ado.net,我想知道SQL Server中执行的SQL查询以及ADO.NET和LINQ to SQL中使用的SQL查询的性能 我将AdventureWorks数据库与扩展的Sales.SalesOrderDetails表一起使用,该表几乎有500万行。执行查询 select * from Sales.SalesOrderDetailEnlarged 在SQL Server中持续约37秒,但在ADO.NET中执行相同查询的时间约为21秒。为了测量执行时间,我使用秒表和SQLServer探查器 // thi

我想知道SQL Server中执行的SQL查询以及ADO.NET和LINQ to SQL中使用的SQL查询的性能

我将AdventureWorks数据库与扩展的Sales.SalesOrderDetails表一起使用,该表几乎有500万行。执行查询

select * 
from Sales.SalesOrderDetailEnlarged
在SQL Server中持续约37秒,但在ADO.NET中执行相同查询的时间约为21秒。为了测量执行时间,我使用秒表和SQLServer探查器

// this is how I perform command execution in ADO.NET
using (SqlConnection sqlConnection = new SqlConnection(GetConnectionString()))
{
    sqlConnection.Open();
    DataSet table = new DataSet();

    using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(commandQuery, sqlConnection))
    {
        //stopwatch start
        sqlDataAdapter.Fill(table);
        //stopwatch stop
    }
}
对于Linq to SQL,我有这样一个查询,它相当于ADO.NET中使用的查询。使用LINQtoSQL执行查询的时间大约为12-13秒

var query = from salesOrderDetail in dataContext.SalesOrderDetailEnlargeds
            select salesOrderDetail;

//stopwatch start
query.ToList();
//stopwatch stop
谁能解释一下:

  • SQL Server中的查询执行不应该比ADO.NET更快吗

  • 如何将ADO.NET和Linq查询的执行时间与SQL进行比较?LINQtoSQL实际上是ADO.NET之上的一个层,那么为什么它比ADO.NET快(或者我试图用错误的方式来衡量它)

  • LINQtoSQL实际上是ADO.NET之上的一个层,那么为什么它比ADO.NET快呢

    NET有两层。DataReader是较低级别的,由ADO.NET代码和L2S/EF代码使用。ADO.NET中的较高级别是DataSet/DataTable/DataAdapter,这是一组用于将查询结果加载到内存中的类。L2S/EF不使用的

    要仅测量查询处理和结果到客户端的传输,请通过DataReader中的行读取,.Read(),但不要对数据执行任何操作

    乙二醇


    要添加到前面的答案中,还请记住Sql server为查询计划和数据保留缓存

    当您想要比较不同的请求时,您应该在每次测量之前使用以下命令或其他方式清除这些情况(使用alter database clear procedure\u cache重新启动服务器…请参阅)

    如果不这样做,第二个度量可能会给出更好但错误的结果,因为数据或计划可能在这些缓存中


    HTH

    您执行查询的顺序是什么?您是否认为存在某种缓存Sql Server端?我以不同的顺序执行了查询,但结果仍然相同。我不知道服务器端有任何可用的缓存。您是说您使用探查器跟踪了问题中代码的执行,并看到探查器报告的持续时间为37秒,秒表报告的持续时间为21秒?我只看到SQL跟踪报告的持续时间较短。SSMS查询显示结果,这需要相当长的时间。另外两个没有。创建数据表也需要时间。换句话说,您正在比较3个完全不同的进程。@mikemon,使用SSMS运行SQL查询不是“在SQL Server中”。SSMS与其他任何应用程序一样是ADO.NET客户端应用程序,探查器报告的持续时间将包括应用程序消耗大量结果所需的时间。我认为如果您在SSMS中使用discard results选项运行查询,您将看到与ADO.NET代码类似的计时,而ADO.NET代码不包括在时间内呈现大型结果集。谢谢您的建议!:)
    int rows = 0;
    using (var dr = cmd.ExecuteReader())
    {
      while (dr.Read())
      {
        rows+=1;
      }
    }
    
    DBCC FREEPROCCACHE
    DBCC DROPCLEANBUFFERS