我的数据库是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)?
答案 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。