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

问题描述 投票:1回答:2

我想知道在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更快(或者也许我尝试用错误的方式对其进行度量)?

sql sql-server performance linq-to-sql ado.net
2个回答
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;
  }
}

0
投票

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

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

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

HTH

© www.soinside.com 2019 - 2024. All rights reserved.