簡體   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