1

我将数据存储在 varbinary(max) 列中,并且出于客户端性能原因,使用 SQL Server 2005 通过“.WRITE()”函数分块写入。这很好用,但由于副作用,我想避免varbinary 列在每次追加期间动态调整大小。

我想做的是通过将 varbinary 列预分配到我想要的大小来优化它。例如,如果我要将 2MB 放入列中,我想先“分配”该列,然后使用偏移量/长度参数 .WRITE 实际数据。

SQL中有什么可以帮助我吗?显然,我不想将空字节数组发送到 SQL 服务器,因为这会部分破坏 .WRITE 优化的目的。

4

2 回答 2

2

如果您使用的是 (MAX) 数据类型,那么 8K 以上的任何内容都会进入行溢出存储,而不是页内存储。因此,您只需要输入足够的数据以使其达到 8K 的行数,从而占用行的页内分配,而其余的则进入行溢出存储。这里还有一些。

如果您想预先分配所有内容,包括行溢出数据,您可以使用类似的东西(例如 10000 字节):

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), '0'), 10000))
于 2010-02-02T01:38:25.100 回答
1

首先对所提供的答案表示敬意-这是一个很大的帮助!但是,您可能需要考虑一个细微的变化。上面的代码实际上使用转换后的零字符(十六进制代码 0x30)分配 varbinary 字段。这可能不是您真正想要的,特别是如果您想稍后在该字段上执行二进制操作。我认为更有用的是为该字段分配一个 NUL 值(十六进制代码 0x00),以便默认关闭所有位。为此,只需进行以下更正:

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), CHAR(0)), 10000))

于 2014-06-17T19:47:16.443 回答