web-dev-qa-db-ja.com

インデックス付けにより、varchar(max)クエリのパフォーマンスとインデックスの作成方法が向上しますか

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

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

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

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

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

14
johna

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

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

8
McGarnagle

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

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

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

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

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

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

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

22
Aaron Bertrand

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

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

18
Diego

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

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

0
Oleksi