Csharp/C#教程:CommandBehavior.SequentialAccess是否有任何性能提升?分享


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

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

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

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

MSDN说的一样

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

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

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

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

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

必须检查和缓存列,因为在使用DataReader时 ,基础流仅对行进行转发以及列访问。

上述就是C#学习教程:CommandBehavior.SequentialAccess是否有任何性能提升?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1004954.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐