フルテキスト インデックス作成をいつ使用する必要がありますか?
-
09-06-2019 - |
質問
クライアントや顧客などを「検索」するクエリが大量にあります。名前、メールアドレスなどで検索できます。LIKE ステートメントは次のように使用します。
SELECT *
FROM customer
WHERE fname LIKE '%someName%'
全文インデックス作成はシナリオに役立ちますか?SQL Server 2005 を使用しています。
解決
DBMS によって異なります。ほとんどのシステムでは、フルテキスト関数を使用しない限り、フルテキスト インデックスを利用できないと思います。(例えば。 試合/対戦 mySQL の場合、または MS SQL の FREETEXT/CONTAINS)
SQL Server でフルテキスト インデックスをいつ、なぜ、どのように使用するかについては、次の優れた記事を参照してください。 SQL Server のフルテキスト インデックス作成について
他のヒント
FTS できる このシナリオでは役に立ちますが、問題はそれだけの価値があるかどうかです。
まずはその理由を見てみましょう LIKE
最も効果的な検索ではない可能性があります。使用するときは LIKE
, 特に、 %
比較の開始時に、SQL Server はすべての単一行のテーブル スキャンを実行する必要があります。 そして チェックしている列をバイトごとにチェックします。
FTS には、名前のバリエーションに関する優れた統計と同様に、データを照合するための優れたアルゴリズムがいくつかあります。したがって、FTS は、Smith を検索するときに Smith、Smythe、Smithers などを照合する際のパフォーマンスを向上させることができます。
ただし、FTS を使用するには少し複雑です。マスターする必要があります。 CONTAINS
対 FREETEXT
そして検索の難解な形式。ただし、FName または LName のいずれかが一致する検索を実行する場合は、OR の代わりに 1 つのステートメントで実行できます。
FTS が効果的かどうかを判断するには、保有するデータの量を確認します。私は数億行のデータベースで FTS を使用していますが、これは FTS で検索するよりも大きな利点です。 LIKE
, ただし、すべてのテーブルで使用しているわけではありません。
テーブル サイズが数百万未満のより適切な場合は、検索対象の列ごとにインデックスを作成することで同様の速度を得ることができます。SQL Server はテーブル スキャンではなくインデックス スキャンを実行する必要があります。
私のテストシナリオによると:
- SQLサーバー2008
- 10.000.000列「Worda wordb wordc ...」のような文字列があります(1〜30ワード)
- CONTAINS(column, "wordB") で count(*) を選択します
- 結果のサイズは数十万
- カタログサイズ 約1.8GB
全文インデックスは 2 秒の範囲内でしたが、 '% wordB %' のように 1~2分の範囲内でした。
ただし、これは追加の選択基準を使用しない場合にのみ考慮されます。 例えば。いくつか使っていたら 「「プレフィックス%」のような」 さらに、主キー列では、フルテキスト インデックスにアクセスする操作の方が、一部のフィールドで文字列検索を実行するよりもコストがかかるため、パフォーマンスが低下しました (コストが大きすぎない限り)。
したがって、全文インデックスをお勧めします のみ 「フリー文字列検索」を実行するか、その特別な機能のいくつかを使用する必要がある場合...
特に MSSQL に関する質問に答えると、フルテキスト インデックス作成は次のようになります。 ない あなたのシナリオに役立ちます。
このクエリを改善するには、次のいずれかを実行できます。
- 列にフルテキスト カタログを構成し、CONTAINS() 関数を使用します。
主に接頭辞を使用して検索していた場合 (つまり、名前の先頭から一致する) を使用するには、述語を次のように変更し、列に対してインデックスを作成します。
ここで、fname は「prefix%」のようなものです
クエリのパフォーマンスが大きな問題でない限り、(1) はおそらくやりすぎです。