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

时间:2013-11-10 20:52:25

标签: c# sql-server performance ado.net sqldatareader

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

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

2 个答案:

答案 0 :(得分:16)

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

MSDN says the same

  

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

答案 1 :(得分:4)

是的,即使不访问BLOB,使用 CommandBehavior.SequentialAccess 也应该至少有一些性能提升。 Microsoft KB文章, An "Invalid attempt to read from column ordinal" error occurs when you use DataReader in Visual C#,声明:

  

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

     

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

     

CommandBehavior.SequentialAccess 还可以在访问非BLOB字段时提高性能。如果未设置 CommandBehavior.SequentialAccess ,则可以不按顺序访问列;但是,您会产生以下开销:

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

必须检查和缓存列,因为当您使用 DataReader 时,基础流只能转发行和列访问。