Sql server varchar上的聚集索引键长度警告(120)?
所以今天我做了一些优化,创建了一些索引视图等等。 我遇到了这个警告 警告!聚集索引的最大密钥长度为900字节。索引“IX_……”的最大长度为8004字节。对于某些大值组合,插入/更新操作将失败 索引是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],'...
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问:)