1

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

警告!聚集索引的最大键长度为 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 字节吗?

为什么我会看到这个警告?

它有效吗?

4

1 回答 1

3

对于您的具体情况,分析您调用的所有输入REPLACE,我们可以看到它们只能使字符串长度相同或更小。

一般来说,即使它的一个输入只是 a REPLACE,理论上也可以返回a 。SQL Server 在这里不执行复杂的分析 - 它看到并假定返回类型为.varchar(8000)varchar(120)replacevarchar(8000)

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

于 2017-09-28T08:58:29.733 回答