2011-12-22 14 views
0

私はsql server 2005データベースに約5,000万レコードを含むテーブルを持っています。 私はfirstNameLastNameの列を持っています。私は、ユーザーがこれらの列を永遠に検索せずに検索できるようにしたいと考えています。 これらの列のインデックスが作成されていないため、クエリを高速化する方法はありますか? また、同様の発音のある名前を検索したいと考えています。たとえば、ユーザーがDannyを検索した場合は、Dan、Danielという名前のレコードも返したいと思います。ユーザーが実際に検索した結果にどの程度近いかをランクで表示するといいでしょう。 これは凝りそうな仕事だと分かっていますが、私はこの問題に直面した世界で最初のものではないと確信しています:)Sql何百万ものレコードを検索します。可能?

ありがとうございます。

+0

「ランクイン%結果について」:このパーセントの計算にはアルゴリズムが必要です。 –

+1

[DIFFERENCE](http://msdn.microsoft.com/en-us/library/aa258844(v=SQL.80).aspx)を使用して、「どの程度近いか」のランクを計算することができます –

+0

「索引が不足していますこれらの列 " - これらの列のインデックスを作成する理由は何ですか? –

答えて

0

フルテキストインデックス作成を試しましたか?私は100万レコード以上のテーブルのフリーテキストフィールドでそれを使用し、それがかなり高速であることを発見しました。さらに、Dan、Danial、およびDannyがすべて同じ索引を付けるように、同義語を追加することができます(名前の同義語の辞書が別の話です)。ワイルドカード検索も可能です。フルテキストインデックス作成はランク付けを行うこともできますが、名前にはあまり役に立たないことがわかりました(ドキュメントの方が良い)。

+0

フルテキスト索引付けは、テキストが厳密に同じ場合にのみ回答を返します。それは、実際には速いが、著者が望んでいたものではない。 – Wis

3

私たちは、50億のレコードを持つデータベースを持っています(オラクル、しかし類似のパフォーマンスを持つ必要があります)。適切なインデックスがあれば数ミリ秒以内に検索することができます。あなたの場合は、firstnameとlastnameにインデックスを付けます。バイナリツリーインデックスを使用すると、パフォーマンスが向上し、データベースのサイズに合わせて拡張されます。注意深いLIKE句は、索引の使用を中断し、パフォーマンスを大幅に低下させることがあります。ワイルドカードが文字列の右側にある場合、MySQLはLIKE句でインデックスを使用し続けることができます。 SQL Serverの同様の検索を行う必要があります。

文字列の類似性は実際には単純ではありません。 http://en.wikipedia.org/wiki/Category:String_similarity_measuresを見ると、いくつかの可能なアルゴリズムが表示されます。 SQL Serverがそのうちの1つを実装しているとは言えませんが、このデータベースはわかりません。おそらく必要なものを見つけるためにGoogleの "SQL Server" +アルゴリズムの名前を試してみてください。それ以外の場合は、Wiki上でさまざまな言語のコードが提供されています(SQLではないかもしれませんが、ストアドプロシージャに適合させる必要があります)。

0

このテーブルとそれらの列に対してフルテキスト検索を有効にすると、これらの列のフルテキストインデックスが作成されます。

関連する問題