所以今天我一直在进行一些优化,创建一些索引视图等。我遇到了这个警告
警告!聚类索引的最大密钥长度为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>)
包装器。