如何有效地追加到大型 varchar(max) 列

meh*_*dvd 1 sql sql-server azure-sql-database

考虑有一个这样的表:

CREATE TABLE Product (
    Id int PRIMARY KEY CLUSTERED,
    InvoicesStr varchar(max)
)
Run Code Online (Sandbox Code Playgroud)

InvoicesStr是包含此产品的发票的串联 ID。我知道这不是一个正确的设计,但我只是提出它来演示我想描述的问题。

所以表数据会是这样的:

Product

Id  | InvoicesStr
----|-------------------------------------
1   | 4,5,6,7,34,6,78,967,3,534,
2   | 454,767,344,567,89676,4435,3,434,
Run Code Online (Sandbox Code Playgroud)

售出数百万件产品后,InvoicesStr将包含一个非常大的字符串。考虑这样一种情况,对于一行,该列包含一个非常大的字符串,比如 1GB 字符串。

我想了解此类更新查询的性能:

Product

Id  | InvoicesStr
----|-------------------------------------
1   | 4,5,6,7,34,6,78,967,3,534,
2   | 454,767,344,567,89676,4435,3,434,
Run Code Online (Sandbox Code Playgroud)

该查询的性能是否取决于 的大小InvoiceStr?或者 SQL Server 是否足够智能,可以仅附加新字符串而不是完全替换它?

Cha*_*ace 5

您可以使用鲜为人知的.WRITE语法来附加或修改max列中的文本/数据。

这会进行有效的追加或替换(如果可能的话,最小化日志记录),并且对于修改大值很有用。请注意,SQL Server 仅修改整个 8k 页,因此修改的数据量最少为 8k(除非现有数据正好填满一个页)。

例如

UPDATE Product
SET InvoicesStr.WRITE('100,', NULL, NULL)
WHERE Id = 2;
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

实际上,通常没有什么理由实际使用这种语法,因为通常不会有这样的非规范化设计。如果您要存储图片或音频之类的内容,您只需替换整个值即可。