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

时间:2019-10-06 16:43:20

标签: sql sql-server performance linq-to-sql ado.net

我想知道在SQL Server中执行并在ADO.NET和LINQ-to-SQL中使用的SQL查询的性能。

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

select * 
from Sales.SalesOrderDetailEnlarged

在SQL Server中持续大约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 Server中的查询执行是否应该比ADO.NET快?

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

2 个答案:

答案 0 :(得分:2)

  

Linq-to-SQL实际上是ADO.NET之上的一层,所以为什么它比ADO.NET快

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

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

例如

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

答案 1 :(得分:0)

要添加到上一个答案,还请记住Sql Server会保留查询计划和数据的缓存。

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

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

如果您不这样做,第二种方法可能会提供更好的-但错误的结果,因为数据或计划可能位于这些缓存中。

HTH