我的应用程序将提供一个英文名称的建议列表,其“听起来像”给定的类型名称。
需要优化查询并尽快返回结果。对于快速返回结果,哪个选项最合适。 (或者你自己的建议,如果你有的话)
一个。生成Soundex Hash并将其存储在“Names”表中,然后执行以下操作:(这样可以保存每个查询的数据库中至少每行产生soundex哈希值吗?)
从NameSoundex = Soundex('Ann')
的名称中选择名称
B中。使用差异功能(这必须为表中的每个名称生成soundex?)
从名称中选择名称,其中差异(名称,'Ann')> = 3
℃。简单比较
从名称中选择名称,其中Soundex(名称)= Soundex('Ann')
选项A似乎对我来说返回结果的速度最快,因为它只为一个字符串生成Soundex,然后与索引列“NameSoundex”进行比较
选项B应该提供比选项A更多的结果,因为名称不必与soundex完全匹配,但可能更慢
假设我的桌子可能包含数百万行,那会产生什么效果?
答案 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