考虑有一个这样的表:
CREATE TABLE Product ( Id int PRIMARY KEY CLUSTERED, InvoicesStr varchar(max) )
这InvoicesStr是包含此产品的发票的串联 ID。我知道这不是一个合适的设计,但我只是提出它来展示我想要描述的问题。
InvoicesStr
所以表数据会是这样的:
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 是否足够聪明,可以只附加新字符串而不是完全替换它?
InvoiceStr
您可以使用鲜为人知的.WRITE语法来附加或修改max列中的文本/数据。
.WRITE
max
这会进行有效的追加或替换(如果可能,尽量减少日志记录),并且对于修改大值很有用。请注意,SQL Server 仅修改整个 8k 页,因此修改数据的最小数量为 8k(除非现有数据完全填满一页)。
例如
UPDATE Product SET InvoicesStr.WRITE('100,', NULL, NULL) WHERE Id = 2;
dbfiddle
实际上,通常没有理由实际使用这种语法,因为您通常不会有这样的非规范化设计。如果您要存储图片或音频之类的内容,则只需替换整个值。