什么时候从 SQL 服务器下载一个值(为了性能)
When is a value downloaded from SQL Server (for performance)
使用来自 SqlCommand
的正常 SqlDataReader
和 SqlConnection
,我想知道:什么时候从 sql 服务器将值下载到我的机器?是当我调用 reader.Read()
还是当我实际使用 reader.GetBytes
获取值时?
我主要担心的是视图中有一些 BLOB 字段。有时我会使用 BLOB 数据从视图中获取数据,有时我会将它们放在外面以加快速度。我想知道我是否应该创建一个不包含 BLOB 字段的不同视图以提高性能(如防止将 BLOB 数据下载到计算机)。
或者是否足以避免使用 reader.GetBytes
获取值?
如果您刚刚调用了 ExecuteReader()
或 ExecuteReader(CommandBehavior)
并且没有设置 CommandBehavior.SequentialAccess
标志,那么当您调用 reader.Read()
.
时将发生读取
如果您使用 .ExecuteReader(CommandBehavior.SequentialAccess)
,它将在您请求时读取值,但您必须按照您在查询中指定的相同顺序请求列,并且在移动到之前必须完整读出每一列下一行。
根据您的描述,当您不需要 blob 数据时,您不应该将列包含在 BLOB 中,您可以保持架构相同,只需进行两个查询
select Col1, Col2, BlobData from Foo
当你想要 blob 并且
select Col1, Col2, cast(null as varbinary(max)) as BlobData from Foo
当您不想要 blob 时,它会保留架构但只传入空值。
使用来自 SqlCommand
的正常 SqlDataReader
和 SqlConnection
,我想知道:什么时候从 sql 服务器将值下载到我的机器?是当我调用 reader.Read()
还是当我实际使用 reader.GetBytes
获取值时?
我主要担心的是视图中有一些 BLOB 字段。有时我会使用 BLOB 数据从视图中获取数据,有时我会将它们放在外面以加快速度。我想知道我是否应该创建一个不包含 BLOB 字段的不同视图以提高性能(如防止将 BLOB 数据下载到计算机)。
或者是否足以避免使用 reader.GetBytes
获取值?
如果您刚刚调用了 ExecuteReader()
或 ExecuteReader(CommandBehavior)
并且没有设置 CommandBehavior.SequentialAccess
标志,那么当您调用 reader.Read()
.
如果您使用 .ExecuteReader(CommandBehavior.SequentialAccess)
,它将在您请求时读取值,但您必须按照您在查询中指定的相同顺序请求列,并且在移动到之前必须完整读出每一列下一行。
根据您的描述,当您不需要 blob 数据时,您不应该将列包含在 BLOB 中,您可以保持架构相同,只需进行两个查询
select Col1, Col2, BlobData from Foo
当你想要 blob 并且
select Col1, Col2, cast(null as varbinary(max)) as BlobData from Foo
当您不想要 blob 时,它会保留架构但只传入空值。