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
谁能解释一下:
SQL 服务器中的查询执行不应该比 ADO.NET 快吗?
如何比较 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
我想知道在 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
谁能解释一下:
SQL 服务器中的查询执行不应该比 ADO.NET 快吗?
如何比较 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