【问题标题】:Best way to index a string column for full string compare为完整字符串比较索引字符串列的最佳方法
【发布时间】:2013-12-10 18:01:24
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server-2008 indexing ssms


    【解决方案1】:

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

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

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

    编辑

    可以通过 SQL Server 使用计算列(已编制索引)来维护 md5 总和上的索引:http://msdn.microsoft.com/en-us/library/ms191250.aspx

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

    【讨论】:

    • 如果我怀疑这种情况会偶尔进行一次数据更新,则不起作用。
    • @YongkeBillYu 对不起,我想我应该提到基于函数的索引。现在对你来说更有意义了吗?
    【解决方案2】:

    nvarchar(max) 列的直接索引是不可能的,因为索引键被限制为 900 字节。

    将列缩减为nvarchar(100)(如果知道该列永远不会包含更长的值)并且其进一步索引似乎是很好的解决方案。

    【讨论】:

    • 好的,我试试看效果如何,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2014-10-02
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多