繁体   English   中英

解决 SQL 服务器中非聚集索引的最大键长度

[英]Workaround maximum key length for a nonclustered index in SQL Server

有没有办法增加 SQL 服务器中 1700 字节的非聚集索引的限制? 当我建立我的数据库时,我收到这个警告:

警告。 非聚集索引的最大键长度为 1700 字节。 索引 'CS_UK' 的最大长度为 8000 字节,用于一些大值的组合。 插入/更新操作将失败。

或者我是否必须更改索引的结构?

即使可能,您也应该考虑更改索引结构。 话虽如此,来自工程团队的博客

SQL Server 2016 和 Azure SQL 数据库增加了具有非聚集索引的索引键的最大大小。 非聚集索引的新最大键大小为 1700 字节。 聚集索引的最大键大小仍为 900 字节。

在文章的最后他们补充说:

对于内存优化表:非聚集索引的最大索引键大小为 2500 字节; 哈希索引的索引键大小没有严格限制。

所以它可能是可能的。

一种解决方法是对创建索引时太大的列使用include

CREATE NONCLUSTERED INDEX IX_IndexSizeTest_Test3 
ON IndexSizeTest (EMPName,EmpPhoneNumber,EmpPostCode) INCLUDE (EmpAddress) 

当本示例中的 EmpAdress 是一个非常大的列时,我们可以使用INCLUDE(EmpAddress)将其添加到索引中,因为当涉及到索引限制时,它不会被计算在内。 以下是有关它的更多详细信息。

OP 没有指定导致警告的详细信息,但是在对本身源自 nvarchar(max) 列的计算列进行索引时,我遇到了同样的警告。

创建计算列时,通过 CASTing 限制其长度。 这个想法归功于这篇文章 这将我的计算列长度从 4000 减少到 100,让我创建索引而没有任何警告。

ALTER TABLE table_name
ADD v_new_computed_column
AS CAST(JSON_VALUE(json_column,'$.some_key') AS NVARCHAR(100) ) ;

作为参考, MS 文档认可了这个 JSON 计算值索引,但没有解决这个边缘情况。

您收到警告是因为您尝试索引的列非常大。 对于我们来说,我们意识到我们不需要那么大的列来建立索引,这也不是很好的性能。 所以,如果您实际上不需要那个尺寸,缩小柱子可以提供更多的结构和安全性。 我不再担心有人不小心往里面扔了太多东西,导致插入失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM