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

时间:2017-09-28 08:50:23

标签: 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],'....',''),'....','') AS [Type], COUNT_BIG(*) AS DistinctTotal
FROM .....
INNER JOIN........

Id是INT

物理表中的aField是VARCHAR(120)

所以索引的最大密钥长度是120 + 4字节不是吗?

为什么我看到这个警告?

有效吗?

1 个答案:

答案 0 :(得分:3)

对于您的特定情况,分析REPLACE次来电的所有输入,我们可以看到他们只能将字符串保持相同的长度或更小。

一般REPLACE理论上可以返回varchar(8000),即使其中一个输入只是varchar(120)。 SQL Server不会在此处执行复杂分析 - 它会看到replace并假设返回类型为varchar(8000)

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