53

クライアントや顧客などを「検索」するクエリがたくさんあります。名前やメールアドレスなどで検索できます。LIKEステートメントは次のように使用しています。

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

フルテキストインデックスはシナリオに役立ちますか?SQLServer2005を使用しています。

4

4 に答える 4

32

それはあなたのDBMSに依存します。フルテキスト関数を使用しない限り、ほとんどのシステムはフルテキストインデックスを利用しないと思います。(例: mySQLのMATCH/AGAINSTまたはMSSQLのFREETEXT/CONTAINS)

SQL Serverでフルテキストインデックスを使用する時期、理由、および方法に関する2つの優れた記事を次に示します。

  1. SQLServer全文検索の使用方法
  2. フルテキストインデックスを使用した複雑なSQL問題の解決
于 2008-09-11T23:42:08.867 に答える
22

FTSこのシナリオに役立ちます。問題は、それだけの価値があるかどうかです。

まず、なぜLIKE最も効果的な検索ではないのかを見てみましょう。を使用する場合LIKE、特に比較の最初に を使用して検索する%場合、SQL Server はすべての行のテーブル スキャンと、チェックしている列のバイトごとのチェックの両方を実行する必要があります

FTS には、名前のバリエーションに関するより優れた統計と同様に、データを照合するためのより優れたアルゴリズムがいくつかあります。したがって、FTS は、Smith を検索するときに、Smith、Smythe、Smithers などのマッチングのパフォーマンスを向上させることができます。

CONTAINSただし、FTS を使用するには、 vsFREETEXTと難解な検索形式をマスターする必要があるため、もう少し複雑です。ただし、FName または LName のいずれかが一致する検索を実行する場合は、OR の代わりに 1 つのステートメントで実行できます。

FTS が効果的かどうかを判断するには、保有しているデータの量を判断します。私は数億行のデータベースで FTS を使用しており、これは での検索よりも優れてLIKEいますが、すべてのテーブルで使用しているわけではありません。

テーブル サイズが数百万未満の妥当な場合は、検索対象の列ごとにインデックスを作成することで同様の速度を得ることができ、SQL Server はテーブル スキャンではなくインデックス スキャンを実行する必要があります。

于 2008-09-12T02:17:01.957 に答える
6

私のテストシナリオによると:

  • SQL Server 2008
  • 10.000.000 行それぞれに「wordA wordB wordC...」のような文字列が含まれます (1 ~ 30 語の間で変化します)
  • CONTAINS(column, "wordB") で count(*) を選択
  • 結果サイズ数十万
  • カタログサイズ 約1.8GB

フルテキスト インデックスは 2 秒の範囲でしたが、'% wordB %'は 1 ~ 2 分の範囲でした。

ただし、これは、追加の選択基準を使用しない場合にのみカウントされます! たとえば、主キー列に「like 'prefix%'」を追加で使用した場合、一部のフィールドで文字列検索を実行するよりもフルテキスト インデックスにアクセスする操作の方がコストがかかるため、パフォーマンスが低下しました (それらがそうでない場合)。過度に)。

したがって、「自由文字列検索」を実行するか、その特別な機能のいくつかを使用する必要がある場合にのみ、全文索引をお勧めします...

于 2013-06-28T15:15:12.413 に答える
3

特に MSSQL に関する質問に答えるために、フルテキスト インデックス作成はあなたのシナリオでは役に立ちません。

そのクエリを改善するには、次のいずれかを実行できます。

  1. 列にフルテキスト カタログを構成し、CONTAINS() 関数を使用します。
  2. 主にプレフィックスを使用して検索する (名前の先頭から一致する) 場合は、述語を次のように変更して、列にインデックスを作成できます。

    fname like 'prefix%'

(1) は、クエリのパフォーマンスが大きな問題でない限り、おそらくやり過ぎです。

于 2008-09-12T00:00:13.907 に答える