【问题标题】:Warning! The maximum key length is 900 bytes. The index has maximum length of 8009 bytes警告!最大密钥长度为 900 字节。索引的最大长度为 8009 字节
【发布时间】:2017-02-09 19:42:44
【问题描述】:

我有一个基于 SHA1 hasbyte 计算列的临时变量。当我在计算列上创建一个 UNIQUE 非聚集索引时,它会抛出警告::

警告!最大密钥长度为 900 字节。索引“UQ__#B445E45__954B055AC5951B75”的最大长度为 8009 字节。对于某些较大值的组合,插入/更新操作将失败。

我记得读出的 SHA1 字节被限制为大约 160 个字节。我无法理解为什么会收到此警告。

如果通过以下查询检查计算列中涉及的所有列的最大长度,则它加起来约为 8148 个字节。但我认为使用我使用的哈希值,计算列的大小应该不超过 160 个字节。

SELECT Sum(c.max_length)
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C.  [object_id]
INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id
WHERE tb.[is_ms_shipped] = 0
and OBJECT_NAME(tb.object_id)='xyz'

请告知我在这里缺少什么。

【问题讨论】:

  • 向我们展示您的计算列?
  • @JuanCarlosOropeza 我的计算列如下所示: CompSum AS HashBytes('SHA1', Col1+ Col2+ Col3+.. 15 more column) 。计算列中包含的所有列都是 varchar(n) 其中 n 不超过 50
  • 是的,但 db 不知道。你需要包括一个演员,否则他会假设最大的 n 允许
  • @JuanCarlosOropeza 你的意思是说,我添加的唯一约束不会理解哈希字节不会超过 160 个字节,我需要添加计算列的 CAST 上限,以便约束不会显示警告?
  • 这只是一个警告。如果您知道输出不能超过 900 字节,则忽略警告。

标签: sql sql-server tsql database-administration


【解决方案1】:

我不是哈希专家:

但我建议你创建一个列combine varchar(750) (15*50)

然后用SET combine = Col1+ Col2+ Col3+.. Col15更新该列

然后尝试:

CompSum AS HashBytes('SHA1', combine)

这样你使用的字段永远不会大于 750

【讨论】:

  • 其实varbinary(20) 可能是一个更好的选择(试试看,你会明白为什么)。但我可能会做CompSum AS CONVERT(varbinary(20), HashBytes('SHA1', col1+col2+...),而不是添加一个额外的计算列。
  • @AaronBertrand 是的,效果更好。我的建议只是测试这是否能解决警告。
  • @AaronBertrand 是的,只需一个简单的 CONVERT 即可消除警告!
猜你喜欢
  • 2023-03-31
  • 2016-04-15
  • 2010-11-05
  • 2011-09-03
  • 2012-05-31
  • 2015-06-22
  • 2012-02-03
相关资源
最近更新 更多