在SQL Server中为一个NVARCHAR(MAX)列建立索引

4
当我将一列定义为NVARCHAR(MAX)时,我无法对该列进行索引。但是我肯定不能将该列定义为NVARCHAR(4000),因为我假设数据字符串有时会更长。
是否有人能建议如何使用NVARCHAR(MAX)数据定义对该列进行索引,或者是否可以将长度从4000增加到更多?

1
在你的列上使用哈希字节并进行索引 - 不,你不能对nvarchar(max)进行索引,这没有意义。 - SqlKindaGuy
你确定你不是在寻找“全文索引”吗? - Damien_The_Unbeliever
1
你希望通过索引大于4000个字符的值来获取什么?你想要搜索完全相等的匹配项还是其他东西? - Martin Smith
我想索引的字段是从另一个表中插入的多个字段的组合(例如多个地址、地址行1..7、城市、国家等),用于匹配/查找匹配记录的百分比。我真的认为,它不会超过900字节,但我想知道是否有可能以某种方式实现。 - Shankar Panda
1个回答

14
  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搜索。只能使用=<>


3
我个人的想法 :) 很棒的答案。 - SqlKindaGuy
实际上,我试图索引的字段是多个字段的组合,用于匹配和决定匹配百分比。我知道它不会超过900个字节,但为了更安全起见,我想知道是否有任何方法可以索引最大长度列。我明白你所说的,这真的是一个很好的解释。谢谢你。 - Shankar Panda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接