优化Soundex查询以查找相似的名称

时间:2010-04-15 06:19:22

标签: sql sql-server soundex

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

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

一个。生成Soundex Hash并将其存储在“Names”表中,然后执行以下操作:(这样可以保存每个查询的数据库中至少每行产生soundex哈希值吗?)

  

从NameSoundex = Soundex('Ann')

的名称中选择名称

B中。使用差异功能(这必须为表中的每个名称生成soundex?)

  

从名称中选择名称,其中差异(名称,'Ann')> = 3

℃。简单比较

  

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

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

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

  • 假设我的桌子可能包含数百万行,那会产生什么效果?

1 个答案:

答案 0 :(得分:0)

您可以预先计算所有姓名的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)<@UserSelectLevel