3

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

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

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

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

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

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

C. 简单比较

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

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

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

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

4

1 回答 1

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

于 2010-04-15T12:08:02.627 回答