SQL 服务器、ADO.NET 和 LINQ-to-SQL 中查询的性能比较

Performance comparison of queries in SQL Server, ADO.NET and LINQ-to-SQL

我想知道在 SQL 服务器中执行并在 ADO.NET 和 LINQ-to-SQL.[=18 中使用的 SQL 查询的性能=]

我使用扩展了 Sales.SalesOrderDetailEnlarged table 的 AdventureWorks 数据库,它有将近 500 万行。执行查询

select * 
from Sales.SalesOrderDetailEnlarged

在 SQL 服务器中持续大约 37 秒,但在 ADO.NET 中执行相同的查询大约需要 21 秒。为了测量执行时间,我使用 Stopwatch 和 SQL Server Profiler。

// 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 中使用的查询。使用 Linq-to-SQL 查询的执行时间大约持续 12-13 秒

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

//stopwatch start
query.ToList();
//stopwatch stop

谁能解释一下:

  1. SQL 服务器中的查询执行不应该比 ADO.NET 快吗?

  2. 如何比较 ADO.NET 和 Linq-to-SQL 此查询的执行时间? Linq-to-SQL 实际上是 ADO.NET 之上的一层,那么为什么它比 ADO.NET 快(或者我尝试以错误的方式测量它)?

Linq-to-SQL is actually a layer on top of ADO.NET, so why is it faster than ADO.NET

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

没有使用

为了仅测量查询处理和结果到客户端的传输,.Read() 遍历 DataReader 中的行,但不对数据执行任何操作。

例如

int rows = 0;
using (var dr = cmd.ExecuteReader())
{
  while (dr.Read())
  {
    rows+=1;
  }
}

要补充上一个答案,还要记住 Sql 服务器保留查询计划和数据的缓存。

当你想比较不同的请求时,你应该在每次测量之前用下面的命令或其他方式清除这些情况(重启服务器,使用alter database clear procedure_cache ...见How can I clear the SQL Server query cache?)

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

HTH