索引 SQL 服务器中的 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) 进行哈希处理

For SQL Server 2014 and earlier, allowed input values are limited to 8000 bytes.

SQL 同样强制唯一性的 Server 2016 代码示例
SHA2_512 哈希给出了最小的冲突机会。对于足够大的 table,像 MD4 这样较弱的散列将命中 birthday problem

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 搜索。只有 =<>