varchar(120) 上的聚簇索引键长度警告?
Clustered index key length warning on varchar(120)?
所以今天我一直在做一些优化,创建一些索引视图等。
我遇到了这个警告
Warning! The maximum key length for a clustered index is 900 bytes. The index 'IX_...' has maximum length of 8004 bytes. For some combination of large values, the insert/update operation will fail.
索引为
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
物理中的一个字段 table 是一个 VARCHAR(120)
那么索引的最大键长度应该是 120+4 字节,不是吗?
为什么我会看到这个警告?
有效吗?
对于你的具体情况,分析你的REPLACE
调用的所有输入,我们可以看到它们只能让字符串保持相同的长度或更短。
但是一般来说,REPLACE
理论上可以return一个varchar(8000)
,即使它的输入之一只是一个[=13] =]. SQL 服务器不会在此处执行复杂的分析 - 它会看到 replace
并假定 return 类型为 varchar(8000)
。
因为我们知道在所有替换之后它永远不会超过 120 个字符,所以在表达式周围添加一个明确的 CONVERT(varchar(120),<existing replaces>)
包装器。
所以今天我一直在做一些优化,创建一些索引视图等。 我遇到了这个警告
Warning! The maximum key length for a clustered index is 900 bytes. The index 'IX_...' has maximum length of 8004 bytes. For some combination of large values, the insert/update operation will fail.
索引为
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
物理中的一个字段 table 是一个 VARCHAR(120)
那么索引的最大键长度应该是 120+4 字节,不是吗?
为什么我会看到这个警告?
有效吗?
对于你的具体情况,分析你的REPLACE
调用的所有输入,我们可以看到它们只能让字符串保持相同的长度或更短。
但是一般来说,REPLACE
理论上可以return一个varchar(8000)
,即使它的输入之一只是一个[=13] =]. SQL 服务器不会在此处执行复杂的分析 - 它会看到 replace
并假定 return 类型为 varchar(8000)
。
因为我们知道在所有替换之后它永远不会超过 120 个字符,所以在表达式周围添加一个明确的 CONVERT(varchar(120),<existing replaces>)
包装器。