所以今天我一直在做一些优化,创建一些索引视图等。 我发现了这个警告
警告!聚簇索引的最大密钥长度为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
物理表中的aField是VARCHAR(120)
所以索引的最大密钥长度是120 + 4字节不是吗?
为什么我看到这个警告?
有效吗?
答案 0 :(得分:3)
对于您的特定情况,分析REPLACE
次来电的所有输入,我们可以看到他们只能将字符串保持相同的长度或更小。
但一般,REPLACE
理论上可以返回varchar(8000)
,即使其中一个输入只是varchar(120)
。 SQL Server不会在此处执行复杂分析 - 它会看到replace
并假设返回类型为varchar(8000)
。
因为我们知道在所有替换后它永远不会超过120个字符,所以在表达式周围添加一个显式的CONVERT(varchar(120),<existing replaces>)
包装器。