Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CommandBehavior.SequentialAccess是否能提高性能?_C#_Sql Server_Performance_Ado.net_Sqldatareader - Fatal编程技术网

C# CommandBehavior.SequentialAccess是否能提高性能?

C# CommandBehavior.SequentialAccess是否能提高性能?,c#,sql-server,performance,ado.net,sqldatareader,C#,Sql Server,Performance,Ado.net,Sqldatareader,我意识到我总是按照索引返回的顺序读取字段(使用常量)。因此,据我所知,我的代码已经与CommandBehavior.SequentialAccess兼容 如果我打开它会有什么好处吗?DataReader已经是forward only,read only,这是真正的性能增益,对吗?这一功能的主要用途是当您读取非常大的CLOB(nvarchar(max)等)或BLOB(varbinary(max))字段时。默认情况下,它会先缓冲整行数据,然后再让您靠近它——这可能意味着它必须为任何BLOB/CLOB

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


如果我打开它会有什么好处吗?DataReader已经是forward only,read only,这是真正的性能增益,对吗?

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

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


是的,使用CommandBehavior.SequentialAccess,即使不访问blob,也应该至少有一些性能提升。微软知识库文章, ,表示:

设置CommandBehavior.SequentialAccess标志会导致数据读取器按顺序读取行和列。行和列没有缓冲。当你读过一列后,它将从内存中删除。任何重新读取列或读取以前读取的列的尝试都会导致异常

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

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

  • 将检查该列,以查看该列是否晚于以前访问的列
  • 检索以前访问的所有列的数据,然后缓存以供以后检索
必须检查和缓存列,因为当您使用数据读取器时,基础流仅用于行和列访问


事实上,现在我想起来了——8040字节(或其倍数)的缓冲区在这里是正常的。IIRC,由于SQL Server中的页面大小是8040,如果您努力完成页面,您往往会获得最佳结果。如果BLOB使用文件流,缓冲区的SQL页面大小仍然是一个考虑因素吗?我的理解是,文件内容存储在NTFS文件系统中。我的团队测量到,所有基于读卡器的访问的性能提高了2倍。我们的数据访问层代码设置为始终强制顺序读取和显式列顺序。如果这样做,则此选项应为默认行为。谢谢你的提示@马修哈扎德,太棒了!是的,我想不出不使用SequentialAccess的理由。很少需要在列之间来回移动,除非,我想,如果您总是通过列名访问它们,在这种情况下,很容易出现故障。很高兴它帮了你,谢谢你分享它是如何为你工作的。