SqlDataReader / DbDataReader 实现问题

3

有人知道DbDataReader实际是如何工作的吗?我们可以以SqlDataReader为例。

当你执行以下操作时:

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

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

数据读取器是否将所有行存储在内存中,还是只获取一行,然后当调用Read时,它会去数据库中获取下一行?似乎仅将一行带入内存会导致性能不佳,但将所有行带入内存会使ExecuteReader调用需要一段时间。
我知道我是对象的使用者,实现方式并不重要,但我只是好奇,我认为我可能需要花几个小时在反编译工具中研究它在做什么,所以想问问可能知道的人。
我只是好奇,有没有人有想法。
2个回答

5
此处所述:

使用DataReader可以通过尽早检索数据以及(默认情况下)仅将一行数据存储在内存中来降低系统开销,从而提高应用程序的性能。

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

4

Rhapsody是正确的。

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

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

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

尽管如此,如果您有长时间运行的查询或大量结果集,则最好使用DataReader,因为您可以更早地获得结果,并且不必将所有数据保存在内存中。还要记住,DataReader只能向前移动,所以如果需要在结果集中移动,则不是最佳选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接