16

まず、SQLServerのインデックスに関する知識があまりないことを指摘しておきます。

私の状況では、通常は大量のテキストで満たされたvarchar(max)列を持つSQLServer2008データベーステーブルがあります。

私のASP.NETWebアプリケーションには、キーワード検索のためにこの列をクエリする検索機能があり、検索されるキーワードの数に応じて、SQLクエリ内の1つまたは複数のLIKE'%keyword%'ステートメントで検索を実行できます。

私のWebアプリケーションでは、このテーブルの1つの列だけでなく、他のさまざまな列でも検索できます。他のテーブルからの結合もいくつかあります。

私の質問は、これらの検索クエリのパフォーマンスを向上させるために、この列にインデックスを作成する価値がありますか?もしそうなら、どのタイプのインデックスで、1つの列にインデックスを付けるだけで十分ですか、それとも主キーや他の検索可能な列などの他の列を含める必要がありますか?

4

4 に答える 4

32

インデックスが検索に役立たない理由について私が今まで見た中で最高の例え'%wildcard%'

二人で連れて行ってください。それぞれに同じ電話帳を渡してください。左側の人に言ってください:

この電話帳に「スミス」という名前の人が何人いるか教えてください。

次に、右側の人に言います。

この電話帳に「サイモン」という名の人が何人いるか教えてください。

インデックスは電話帳のようなものです。最初にあるものを探すのはとても簡単です。途中または最後にあるものをスキャンするのは非常に困難です。

セッションでこれを繰り返すたびに、電球が点灯しているのが見えるので、ここで共有すると便利かもしれないと思いました。

于 2012-05-03T00:21:54.433 に答える
20

varchar(max)フィールドにインデックスを作成することはできません。インデックスの最大バイト数は900です。列が900バイトより大きい場合、インデックスを作成できますが、900バイトを超える挿入は失敗します。

全文検索について読むことをお勧めします。この場合はあなたに合っているはずです

于 2012-05-02T23:07:16.400 に答える
10

LIKE'%keyword%'検索を実行している場合は、通常のインデックスを作成する価値はありません。その理由は、索引付けは辞書の検索のように機能するためです。辞書の検索では、途中から始めて、単語が見つかるまで差を分割します。このワイルドカードクエリは、「to」などのテキストを含む単語を検索するように求めるようなものです。一致するものを見つける唯一の方法は、辞書全体をスキャンすることです。

ただし、この種のシナリオを対象とした全文検索を検討することもできます(ここを参照)。

于 2012-05-02T23:00:45.597 に答える
0

見つけるための最良の方法は、実際に起こることと似た一連のテストクエリを作成し、インデックスがある場合とない場合のDBに対してそれらを実行することです。ただし、一般に、SELECTクエリを多く実行し、UPDATE / DELETEクエリをほとんど実行しない場合、インデックスを使用するとクエリが高速になる可能性があります。

ただし、多くの更新を行うと、インデックスによってパフォーマンスが低下する可能性があるため、この決定を行う前に、DBが処理する必要のあるクエリの種類を知っておく必要があります。

于 2012-05-02T22:59:23.627 に答える