2017-09-28 57 views
1

所以今天我一直在做一些优化创造了一些索引视图等 ,我碰到这个警告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........ 

标识为INT

更远在物理表是VARCHAR(120)

所以索引的最大密钥长度将是120 + 4乘tes会不会?

为什么我看到这个警告?

它有效吗?

+0

什么是id的大小,请输入 – TheGameiswar

+0

请尝试创建一个简单的示例,以便我们可以对其进行测试 – TheGameiswar

+0

https://docs.microsoft.com/en-us/sql/t-sql/data-types/ INT-BIGINT,SMALLINT和-TINYINT-的Transact-SQL INT为4个字节,作为陈述的类型是<120个字节 – Mark

回答

3

对于具体情况,分析所有的输入您的通话REPLACE,我们可以看到,他们只能永远离开了字符串的长度相同或更小。

一般REPLACE在理论上返回varchar(8000)即使它的一个输入只是一个varchar(120)。 SQL Server不会在这里进行复杂的分析 - 它看到replace和假设的varchar(8000)返回类型。

因为我们都知道更换后,绝不会超过120个字符,周围添加表达一个明确的CONVERT(varchar(120),<existing replaces>)包装。

+0

谢谢,我曾暗自怀疑这是发生了什么事,但不容易找到答案如此反问SO: ) – Mark

相关问题