我想知道在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更快(或者也许我尝试用错误的方式对其进行度量)?
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;
}
}
要添加到上一个答案,还请记住,Sql Server为查询计划和数据保留缓存。
[当您要比较不同的请求时,应该在每个度量之前使用以下命令或通过其他方式清除这些情况(重新启动服务器,使用alter database clear procedure_cache ...参见How can I clear the SQL Server query cache?)
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
如果不这样做,第二种方法可能会提供更好的结果,但结果却是错误的,因为数据或计划可能在这些缓存中。
HTH