SqlDataReader / DbDataReader实现问题

时间:2010-03-25 13:04:59

标签: sql sqldatareader dbdatareader

有谁知道DbDataReaders的实际工作方式。我们可以使用SqlDataReader作为示例。

当您执行以下操作时

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

while(rdr.Read())
{
  //Do something
}

数据读取器是否具有内存中的所有行,或者它只是抓取一行,然后当调用Read时,它是否会转到数据库并抓住下一个?似乎只是将一个内存带入内存将是糟糕的性能,但带来所有这些将使得它需要一段时间调用ExecuteReader。

我知道我是这个对象的消费者并不关心他们如何实现它,但我只是好奇,我想我可能会花几个小时在Reflector中来了解它它正在做什么,所以以为我会问一个可能知道的人。

我很好奇是否有人有想法。

2 个答案:

答案 0 :(得分:5)

如上所述here

  

使用DataReader可以增加   应用程序性能均由   尽快检索数据   可用,和(默认情况下)存储   内存中一次只有一行,   减少系统开销。

据我所知,这是每个读者在.NET框架中工作的方式。

答案 1 :(得分:4)

狂想曲是正确的。

  

结果将作为查询返回   执行,并存储在   客户端上的网络缓冲区,直到你   使用Read方法请求它们   DataReader

我在相同的10,000记录数据集上使用DataReaders和DataAdaptors进行了测试,我发现DataAdaptor始终比DataReader快3-4毫秒,但DataAdaptor最终会保留更多内存。

当我在相同的50,000个记录数据集上运行相同的测试时,我看到DataReader端的性能提升为50毫秒。

话虽如此,如果您有一个长时间运行的查询或一个巨大的结果集,我认为您可能会更好地使用DataReader,因为您可以更快地获得结果并且不必保留内存中的所有数据。同样重要的是要记住,DataReader只是前向的,因此如果您需要在结果集中移动,那么它不是最佳选择。