3

有谁知道 DbDataReaders 是如何工作的。我们可以使用 SqlDataReader 作为示例。

当您执行以下操作时

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

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

数据读取器是否在内存中拥有所有行,或者它只是抓取一个,然后当调用 Read 时,它会去数据库并抓取下一个吗?似乎只是将一个带入内存会带来不好的性能,但是将它们全部带入会使调用 ExecuteReader 需要一段时间。

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

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

4

2 回答 2

5

如此处所述:

使用 DataReader 可以通过在数据可用时立即检索数据以及(默认情况下)在内存中一次仅存储一行来提高应用程序性能,从而减少系统开销。

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

于 2010-03-25T13:11:34.473 回答
4

狂想曲是正确的。

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

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

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

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

于 2010-03-25T15:13:44.150 回答