一尘不染

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

sql

考虑有一个这样的表:

CREATE TABLE Product (
    Id int PRIMARY KEY CLUSTERED,
    InvoicesStr varchar(max)
)

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,

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

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

UPDATE Product
SET InvoiceStr = InvoiceStr + '584,'
WHERE Id = 100

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


阅读 84

收藏
2022-07-22

共1个答案

一尘不染

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

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

例如

UPDATE Product
SET InvoicesStr.WRITE('100,', NULL, NULL)
WHERE Id = 2;

dbfiddle

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

2022-07-22