簡體   English   中英

在 SQL Server 中索引 NVARCHAR(MAX) 列

[英]Indexing an NVARCHAR(MAX) column in SQL Server

當我將一列定義為NVARCHAR(MAX) ,我無法索引該列。 但我當然不能將列定義為NVARCHAR(4000)因為我認為數據字符串有時會更長。

任何人都可以建議如何使用NVARCHAR(MAX)數據定義對列進行索引,或者是否可以將長度從 4000 增加到更多?

  1. 您有 nvarchar(4000) 或 nvarchar(max)。 中間什么都沒有
  2. 索引鍵列的最大長度加在一起是 900 字節,因此您也不能索引 nvarchar(4000)(即 8000 字節)

就個人而言,我不明白為什么需要索引 nvarchar(max)。
您真的要搜索長達 1GB 的字符串嗎?

無論如何,您唯一的選擇是在持久計算列中使用HASHBYTES
您創建列的散列,並索引散列。

請注意,根據您可能無法對 nvarchar(max) 進行哈希處理的版本

對於 SQL Server 2014 及更早版本,允許的輸入值限制為 8000 字節。

也強制執行唯一性的 SQL Server 2016 代碼示例
SHA2_512 散列給出的碰撞機會最小。 對於足夠大的表,像 MD4 這樣較弱的散列會遇到生日問題

CREATE TABLE dbo.HashExample (
    SomeID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    SomeLongText nvarchar(MAX) NULL,
    SomeHash AS HASHBYTES('SHA2_512', SomeLongText) PERSISTED
)
GO
CREATE UNIQUE INDEX UX_SomeHash ON dbo.HashExample(SomeHash) WHERE SomeLongText IS NULL
GO

INSERT dbo.HashExample (SomeLongText) VALUES ('Row 1'), ('Row 2')
GO
SELECT * FROM dbo.HashExample
GO

DECLARE @LookFor nvarchar(MAX) = 'Row 3'
SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
SET @LookFor = 'Row 2'
SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
GO

請注意,您不能進行 LIKE 搜索。 只有=<>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM