【问题标题】:SQL Server - nvarchar(max) full text index useful when doing exact match?SQL Server - nvarchar(max) 全文索引在进行完全匹配时有用吗?
【发布时间】:2012-12-12 22:38:12
【问题描述】:

我在表中有一个类型为 nvarchar(max) 的列,在某些情况下我需要对该列的内容执行完全匹配。

我知道我可以创建一个全文索引,从广义上讲,据我了解,它对文本进行标记,以便在想要在字符串中搜索时进行更有效的查询。我想知道,在执行完全匹配时,全文索引在提高性能方面是否真的有任何用处?

有没有更好的选择?

【问题讨论】:

    标签: sql sql-server-2008 sql-server-2005


    【解决方案1】:

    如果您需要检查的只是完全匹配,您可以创建一个计算列,它是nvarchar(max) 字段的哈希值。

    这将足够小,可以索引,但仍会指示字段是否完全匹配。

    一般的想法是:

    ALTER TABLE MyTable
    ADD HashField as HASHBYTES('MD5', LongfieldName)
    

    【讨论】:

    • 进一步的研究表明,Hashbytes 只会散列长度不超过 8000 的字符串。因此,不能仅在使用 NVARCHAR(MAX) 时依赖它。
    • @user1085351 - 您最长字段的长度是多少?如果不少于 16k 个字符,那么您可以分别散列左侧 8k 和右侧 8k。
    • 如果你是这个意思,我不能保证 NVARCHAR(MAX) 的内容会小于 8000?
    • 是的,根据我的阅读,您可以创建自定义散列函数/clr 存储过程来创建整个事物的散列,或者只散列前 8000 个字符,但在执行匹配时确保您在哈希和字符串本身上执行此操作。这种方式仍然需要进行一些字符串比较,但使用散列会大大减少比较次数。
    【解决方案2】:

    我知道这是一个老问题,我会评论 JNK 的回答,但我没有代表这样做......

    首先,由于您使用的是 Nvarchar,因此您必须非常小心,以确保在排序规则哈希中比较相等的字符串相等;除非您使用二进制排序规则,否则除非您的哈希算法支持 Unicode 或您首先规范化字符串,否则不会发生这种情况。 Unicode 允许相同字符的不同表示,例如 É 可以表示为代码点 U+00C9,或代码点 U+0045 (E) 后跟代码点 U+0301(组合锐音)。

    其次,像 MD5 这样的加密散列算法不能很好地满足这里的需求,因为你在散列是为了性能而不是安全。您不需要在每次插入和每次查询开始时花费那么多 CPU,也不需要索引键那么大。你想要的是几乎 .NET StringComparer.GetHashCode() 函数,它速度很快,可以处理逻辑上但二进制不相等的字符,并生成一个小的哈希码,因此可以非常快速地进行比较。遗憾的是,MS 保留随意更改该算法的权利,这会破坏任何存储的哈希值。如果你还是要使用 CLR,我可能会建议从 Mono 项目中窃取适当的 GetHashCode 实现——他们的类库是 MIT 许可的,所以只要你在源代码中保留版权声明,你就可以随意提升它们。

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2011-06-11
      • 2018-05-22
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多