2010-04-15 68 views
3

我的應用程序將提供一個「聽起來像」給定類型名稱的英文名稱建議列表。優化Soundex尋找類似名稱的查詢

該查詢需要進行優化並儘可能快地返回結果。哪個選項最適合快速返回結果。 (或者你自己的建議,如果你有的話)

A.生成Soundex Hash並將其存儲在「Names」表中,然後執行如下操作:(這節省了爲我的至少每一行生成soundex散列每次查詢右分貝?)

選擇的名字從名字在那裏NameSoundex = SOUNDEX(「安」)

B.採用差分功能(這必須生成表中的每個名字的同音? )

從名稱

選擇名稱,其中差異(名稱, '安')> = 3

C.簡單比較

從名稱

選擇名稱,其中探測法(名稱)=探測法( '安')

  • 選項A好像對我來說會以最快的速度返回結果,因爲它只是一個字符串產生了Soundex然後比較對索引列「NameSoundex」

  • 選項B應給予比選擇更的結果,因爲該名稱不必是同音的精確匹配,但可能會比較慢

  • 假設我的表可能包含數百萬行,你會產生最好的結果?

+1

看來你已經回答了你自己的問題。選項A確實是最快的。選項B的確會產生更多的結果,並且會更慢。選項C會給你與選項A相同的結果,但也會(很慢)。 – 2010-04-15 08:51:40

回答

0

,你可以預先計算所有人的名字後的差額(),並將它們存儲在像表:

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