我想知道在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
有人可以解释:
SQL Server中的查询执行是否应该比ADO.NET快?
如何比较针对ADO.NET和Linq-to-SQL的此查询的时间执行? Linq-to-SQL实际上是ADO.NET之上的一层,那么为什么它比ADO.NET更快(或者也许我尝试以错误的方式对其进行度量)?
答案 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