3

私のアプリケーションは、入力された名前に「似ている」英語名の候補のリストを提供します。

クエリを最適化し、できるだけ早く結果を返す必要があります。結果をすばやく返すために最適なオプションはどれですか。(または、お持ちの場合は独自の提案)

A. Soundex ハッシュを生成し、それを「Names」テーブルに保存してから、次のようにします: (これにより、クエリごとにデータベース内の少なくともすべての行の soundex ハッシュを生成する手間が省けますよね?)

NameSoundex = Soundex('Ann') の名前から名前を選択

B. Difference 関数を使用する (テーブル内のすべての名前の soundex を生成する必要がありますか?)

Difference(name, 'Ann') >= 3 の名前から名前を選択

C. 簡単な比較

Soundex(name) = Soundex('Ann') の名前から名前を選択

  • オプションAは、1つの文字列の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 に答える