Sql server varchar上的聚集索引键长度警告(120)?

Sql server varchar上的聚集索引键长度警告(120)?,sql-server,tsql,indexing,sql-server-2012,indexed-views,Sql Server,Tsql,Indexing,Sql Server 2012,Indexed Views,所以今天我做了一些优化,创建了一些索引视图等等。 我遇到了这个警告 警告!聚集索引的最大密钥长度为900字节。索引“IX_……”的最大长度为8004字节。对于某些大值组合,插入/更新操作将失败 索引是 CREATE UNIQUE CLUSTERED INDEX IX_.. ON [aView] ([id], [type]) 观点是 CREATE VIEW aView WITH SCHEMABINDING AS SELECT Id, Replace(Replace([aField],'...

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

警告!聚集索引的最大密钥长度为900字节。索引“IX_……”的最大长度为8004字节。对于某些大值组合,插入/更新操作将失败

索引是

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

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

所以索引的最大键长度是120+4字节,不是吗

为什么我会看到这个警告

它有效吗?

对于您的特定情况,分析
REPLACE
调用的所有输入,我们可以看到它们只能保留相同长度或更小的字符串

但一般来说,
REPLACE
理论上可以返回一个
varchar(8000)
,即使它的一个输入只有一个
varchar(120)
。SQL Server在这里不执行复杂的分析-它看到
replace
,并假定返回类型为
varchar(8000)


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

id的大小,类型请尝试创建一个简单的示例,以便我们可以测试它INT为4字节,所述类型为<120 bytesThanks,我暗自怀疑这就是正在发生的事情,但却很难找到答案,所以so问:)