【问题标题】:SqlDataReader, a firehose cursor - no buffering?SqlDataReader,一个 firehose 游标 - 没有缓冲?
【发布时间】:2009-11-08 11:44:25
【问题描述】:

所以我知道 SqlDataReader 相当快,你不知道你会得到多少行,它一次只为每一行分配内存。因此,如果我有一百万行小行(比如 4 到 32 个字节),每行读取意味着往返于服务器?没有缓冲是吧?

如果我通过 SQL Native Client 使用 ODBC,我可以设置一个适当大的行缓冲区,以便每次往返获取 512 行。当消费者读取第 0 行时,我读取 512 行然后返回第 0 行,接下来的 511 次读取是内存访问,第 513 次读取是新的往返。

对我来说,这应该更快(并且不必只转发),但这也取决于结果集如何在服务器上实现。在后一种情况下,结果集必须在我开始通过网络获取之前完成,但对于 SqlDataReader 和我相信它使用的 TDS 可能不是这种情况(?),我不熟悉的协议。任何 cmets 表示赞赏。

【问题讨论】:

标签: c# odbc sqldatareader


【解决方案1】:

DataReader 通过其 api 一次只分发 1 行,但它从数据库中批量获取数据,缓冲数据,因此它不必为每一行往返于数据库。

【讨论】:

    【解决方案2】:

    不,SqlDataReader 确实在客户端进行缓冲。绝对不是往返服务器来获取您的行。

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 2016-02-03
      • 1970-01-01
      • 2019-03-19
      • 2013-11-28
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多