varchar(120) 上的聚簇索引键长度警告?

Clustered index key length warning on varchar(120)?

所以今天我一直在做一些优化,创建一些索引视图等。 我遇到了这个警告

Warning! The maximum key length for a clustered index is 900 bytes. The index 'IX_...' has maximum length of 8004 bytes. For some combination of large values, the insert/update operation will fail.

索引为

CREATE UNIQUE CLUSTERED INDEX IX_.. ON  [aView] ([id], [type])

观点是

CREATE VIEW aView
WITH SCHEMABINDING
AS 
SELECT Id, Replace(Replace([aField],'....',''),'....','') AS [Type], COUNT_BIG(*) AS DistinctTotal
FROM .....
INNER JOIN........

Id 是一个 INT

物理中的一个字段 table 是一个 VARCHAR(120)

那么索引的最大键长度应该是 120+4 字节,不是吗?

为什么我会看到这个警告?

有效吗?

对于的具体情况,分析你的REPLACE调用的所有输入,我们可以看到它们只能让字符串保持相同的长度或更短。

但是一般来说REPLACE理论上可以return一个varchar(8000),即使它的输入之一只是一个[=13] =]. SQL 服务器不会在此处执行复杂的分析 - 它会看到 replace 并假定 return 类型为 varchar(8000)

因为我们知道在所有替换之后它永远不会超过 120 个字符,所以在表达式周围添加一个明确的 CONVERT(varchar(120),<existing replaces>) 包装器。