有谁知道DbDataReaders的实际工作方式。我们可以使用SqlDataReader作为示例。
当您执行以下操作时
cmd.CommandText = "SELECT * FROM Customers";
var rdr = cmd.ExecuteReader();
while(rdr.Read())
{
//Do something
}
数据读取器是否具有内存中的所有行,或者它只是抓取一行,然后当调用Read时,它是否会转到数据库并抓住下一个?似乎只是将一个内存带入内存将是糟糕的性能,但带来所有这些将使得它需要一段时间调用ExecuteReader。
我知道我是这个对象的消费者并不关心他们如何实现它,但我只是好奇,我想我可能会花几个小时在Reflector中来了解它它正在做什么,所以以为我会问一个可能知道的人。
我很好奇是否有人有想法。
答案 0 :(得分:5)
如上所述here:
使用DataReader可以增加 应用程序性能均由 尽快检索数据 可用,和(默认情况下)存储 内存中一次只有一行, 减少系统开销。
据我所知,这是每个读者在.NET框架中工作的方式。
答案 1 :(得分:4)
狂想曲是正确的。
结果将作为查询返回 执行,并存储在 客户端上的网络缓冲区,直到你 使用Read方法请求它们 DataReader
我在相同的10,000记录数据集上使用DataReaders和DataAdaptors进行了测试,我发现DataAdaptor始终比DataReader快3-4毫秒,但DataAdaptor最终会保留更多内存。
当我在相同的50,000个记录数据集上运行相同的测试时,我看到DataReader端的性能提升为50毫秒。
话虽如此,如果您有一个长时间运行的查询或一个巨大的结果集,我认为您可能会更好地使用DataReader,因为您可以更快地获得结果并且不必保留内存中的所有数据。同样重要的是要记住,DataReader只是前向的,因此如果您需要在结果集中移动,那么它不是最佳选择。