CommandBehavior.SequentialAccess是否有任何性能提升?

Car*_*l R 10 c# sql-server performance ado.net sqldatareader

我意识到我总是按索引返回的顺序读取我的字段(使用常量).所以据我所知,我的代码已经与CommandBehavior.SequentialAccess兼容.

如果我打开它会有任何好处吗?DataReader只是前传,只读是真正的性能增益吗?

Mar*_*ell 16

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

MSDN说的一样

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


Sol*_*zky 8

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

设置 CommandBehavior.SequentialAccess 标志会导致DataReader依次读取行和列。行和列没有缓冲。读过一列后,它会从内存中删除。任何重新读取列或读取先前读取的列的尝试都会导致异常。

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

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

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

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

  • 我的团队测量了所有基于阅读器的访问的 2 倍性能改进。我们的数据访问层代码设置为始终强制执行顺序读取和明确的列顺序。如果你这样做,这个选项应该是默认行为。谢谢你的提示! (4认同)