11

I realized I always read my fields in the order they are returned by index (using constants). So my code is already compatible with CommandBehavior.SequentialAccess as far as i understand.

Would there be any benefits if i turn it on? DataReader is already forward only, read only which is the real performance gain right?

4

2 回答 2

16

它的主要用途是当您读取非常大的 CLOB ( nvarchar(max)etc) 或 BLOB ( varbinary(max)) 字段时。在默认用法中,它会在让您靠近它之前缓冲整行数据 - 这可能意味着它必须为任何 BLOB / CLOB 字段分配一个大缓冲区。使用顺序模式时,不缓冲行;您可以将常规 API 用于小字段(只要您以正确的顺序访问它们),但对于 CLOB / BLOB 字段,您可以使用基于块的 API(GetBytesGetChars)依次访问部分数据。例如,通过这样做,您可以仅使用 1k 或 4k 缓冲区来处理 40 MB 的图像。

MSDN 也这么说

为 DataReader 提供一种方法来处理包含具有较大二进制值的列的行。SequentialAccess 不是加载整个行,而是使 DataReader 能够将数据作为流加载。然后,您可以使用 GetBytes 或 GetChars 方法指定开始读取操作的字节位置,以及返回数据的有限缓冲区大小。

于 2013-11-10T21:01:08.193 回答
8

是的,使用CommandBehavior.SequentialAccess至少应该有一些性能提升,即使不访问 BLOB 也是如此。Microsoft KB 文章 “在 Visual C# 中使用 DataReader 时出现“尝试从列序号读取无效”错误,指出:

设置 CommandBehavior.SequentialAccess 标志会导致DataReader按顺序读取行和列。行和列不被缓冲。在您读完一列后,它会从内存中删除。任何重新读取列或读取以前读取的列的尝试都会导致异常。

使用CommandBehavior.SequentialAccess标志提供了性能优势,尤其是在使用二进制大对象 (BLOB) 字段时。如果不使用SequentialAccess,则所有 BLOB 数据都将复制到客户端。这会消耗大量资源。

CommandBehavior.SequentialAccess还提高了访问非 BLOB 字段时的性能。未设置CommandBehavior.SequentialAccess时,可以乱序访问列;但是,您会产生以下开销:

  • 检查该列以查看该列是否晚于先前访问的列。
  • 检索所有先前访问的列的数据,然后缓存以供以后检索。

必须检查和缓存列,因为当您使用DataReader时,底层流对于行和列访问都是只进的。

于 2017-02-13T18:15:42.673 回答