クライアントや顧客などを「検索」するクエリがたくさんあります。名前やメールアドレスなどで検索できます。LIKEステートメントは次のように使用しています。
SELECT *
FROM customer
WHERE fname LIKE '%someName%'
フルテキストインデックスはシナリオに役立ちますか?SQLServer2005を使用しています。
クライアントや顧客などを「検索」するクエリがたくさんあります。名前やメールアドレスなどで検索できます。LIKEステートメントは次のように使用しています。
SELECT *
FROM customer
WHERE fname LIKE '%someName%'
フルテキストインデックスはシナリオに役立ちますか?SQLServer2005を使用しています。
それはあなたのDBMSに依存します。フルテキスト関数を使用しない限り、ほとんどのシステムはフルテキストインデックスを利用しないと思います。(例: mySQLのMATCH/AGAINSTまたはMSSQLのFREETEXT/CONTAINS)
SQL Serverでフルテキストインデックスを使用する時期、理由、および方法に関する2つの優れた記事を次に示します。
FTSはこのシナリオに役立ちます。問題は、それだけの価値があるかどうかです。
まず、なぜLIKE
最も効果的な検索ではないのかを見てみましょう。を使用する場合LIKE
、特に比較の最初に を使用して検索する%
場合、SQL Server はすべての行のテーブル スキャンと、チェックしている列のバイトごとのチェックの両方を実行する必要があります。
FTS には、名前のバリエーションに関するより優れた統計と同様に、データを照合するためのより優れたアルゴリズムがいくつかあります。したがって、FTS は、Smith を検索するときに、Smith、Smythe、Smithers などのマッチングのパフォーマンスを向上させることができます。
CONTAINS
ただし、FTS を使用するには、 vsFREETEXT
と難解な検索形式をマスターする必要があるため、もう少し複雑です。ただし、FName または LName のいずれかが一致する検索を実行する場合は、OR の代わりに 1 つのステートメントで実行できます。
FTS が効果的かどうかを判断するには、保有しているデータの量を判断します。私は数億行のデータベースで FTS を使用しており、これは での検索よりも優れてLIKE
いますが、すべてのテーブルで使用しているわけではありません。
テーブル サイズが数百万未満の妥当な場合は、検索対象の列ごとにインデックスを作成することで同様の速度を得ることができ、SQL Server はテーブル スキャンではなくインデックス スキャンを実行する必要があります。
私のテストシナリオによると:
フルテキスト インデックスは 2 秒の範囲でしたが、'% wordB %'は 1 ~ 2 分の範囲でした。
ただし、これは、追加の選択基準を使用しない場合にのみカウントされます! たとえば、主キー列に「like 'prefix%'」を追加で使用した場合、一部のフィールドで文字列検索を実行するよりもフルテキスト インデックスにアクセスする操作の方がコストがかかるため、パフォーマンスが低下しました (それらがそうでない場合)。過度に)。
したがって、「自由文字列検索」を実行するか、その特別な機能のいくつかを使用する必要がある場合にのみ、全文索引をお勧めします...
特に MSSQL に関する質問に答えるために、フルテキスト インデックス作成はあなたのシナリオでは役に立ちません。
そのクエリを改善するには、次のいずれかを実行できます。
主にプレフィックスを使用して検索する (名前の先頭から一致する) 場合は、述語を次のように変更して、列にインデックスを作成できます。
fname like 'prefix%'
(1) は、クエリのパフォーマンスが大きな問題でない限り、おそらくやり過ぎです。