索引字符串列以进行完整字符串比较的最佳方法

时间:2013-11-25 20:35:38

标签: sql sql-server-2008 indexing ssms

我的数据库是MS SQL 2008,我正在使用SQL Server Management Studio。

我有一个NVARCHAR(MAX)字段,存储一个名为INTERNALDATA的字符串,存储数据,如“SOME_NAME:SOME_ID”,不要问我为什么我不用SOME_ID创建另一个int列,这是项目得到设置的方式我现在无法改变它。

所以现在我需要在这个领域进行比较,感谢上帝,这不是子字符串比较。这是完整的列比较:

INTERNALDATA = "Bill:5"

现在你可以想象,这真的很慢,我应该使用什么索引或更改列类型以使其更快?

PS:此字段中存储的实际数据预计不会超过100个字符长,也许我应该将NVARCHAR(MAX)更改为NVARCHAR(100)?

2 个答案:

答案 0 :(得分:0)

无法直接索引nvarchar(max)列,因为索引键限制为900字节。

将列向下切割到nvarchar(100)(如果已知列永远不会包含更长的值),并且其进一步索引似乎是很好的解决方案。

答案 1 :(得分:0)

索引长字符串进行相等搜索的一种常用方法是索引哈希和(例如,md5),然后在两个列上进行比较(原始原始值以及哈希值)。 / p>

在SQL Server中,您可以使用HASHBYTES,例如:http://technet.microsoft.com/en-us/library/ms174415.aspx(但自身限制为8000字节)。

比较两列(原始和散列)的原因是为了防止在散列函数中发生冲突时出现误报。您甚至可以通过仅使用部分哈希值(不是所有位)来保持索引更小(里程取决于您的数据)来获得性能。

修改

对于md5总和的索引的维护可以由SQL Server使用计算列(已编入索引)来完成:http://msdn.microsoft.com/en-us/library/ms191250.aspx

这个概念通常被称为function based indexing