在VARCHAR(120)上簇状索引密钥长度警告



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

警告!聚类索引的最大密钥长度为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),<existing replaces>)包装器。

最新更新