【问题标题】:Optimizing a Soundex Query for finding similar names优化 Soundex 查询以查找相似名称
【发布时间】:2011-02-08 05:54:12
【问题描述】:

我的应用程序将为“听起来像”给定类型名称的英文名称提供建议列表。

查询需要优化并尽快返回结果。哪个选项最适合快速返回结果。 (或者你自己的建议,如果你有的话)

A.生成 Soundex 哈希并将其存储在“名称”表中,然后执行以下操作:(这样可以节省每次查询至少为我的数据库中的每一行生成 soundex 哈希吗?)

从 NameSoundex = Soundex('Ann') 的名称中选择名称

B.使用差异函数(这必须为表中的每个名称生成 soundex?)

从 Difference(name, 'Ann') >= 3 的名称中选择名称

C.简单对比

从其中 Soundex(name) = Soundex('Ann') 的名称中选择名称

  • 选项 A 在我看来是最快的返回结果,因为它只为一个字符串生成 Soundex,然后与索引列“NameSoundex”进行比较

  • 选项 B 应该比选项 A 提供更多结果,因为名称不必与 soundex 完全匹配,但可能会更慢

  • 假设我的表可能包含数百万行,那么什么会产生最佳结果?

【问题讨论】:

  • 看来您已经回答了自己的问题。选项 A 确实是最快的。选项 B 确实会产生更多的结果,而且会更慢。选项 C 将给您与选项 A 相同的结果,但也会(非常)慢。

标签: sql sql-server soundex


【解决方案1】:

您可以预先计算所有姓名的 DIFFERENCE() 并将它们存储在如下表中:

Differences
Name1
Name2
Difference


INSERT INTO Differences
        (Name1,Name2,Difference)
    SELECT
        n1.Name,n2.Name,DIFFERENCE(n1.Name,n2.Name)
        FROM Names           n1
            CROSS JOIN Names n2
        WHERE DIFFERENCE(n1.Name,n2.Name)<??? --to put a cap on what to store

如果用户输入您现有的名称之一,您很快就会发现差异。如果用户输入的名称不在您的名称表中,您可以执行选项 A 或 B。您甚至可以在选择列表中让他们选择“差异”。零将是您的选项 A,任何值都将使用选项 B,首先尝试使用差异表,然后使用蛮力表扫描 WHERE DIFFERENCE(@givenName,Names.Name)&lt;@UserSelectLevel

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 2017-10-07
    • 2021-06-14
    • 1970-01-01
    • 2015-11-10
    • 2020-03-26
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多