web-dev-qa-db-ja.com

SQL ServerでのLIKEとCONTAINSの関係

次のクエリのどれが速いです(LIKE対CONTAINS)?

SELECT * FROM table WHERE Column LIKE '%test%';

または

SELECT * FROM table WHERE Contains(Column, "test");
174
user667429

2番目( CONTAINS を意味し、実際に有効なクエリに入れると仮定した場合)は、some形式のインデックス(この場合はフルテキストインデックス)を使用できるため、高速になります。もちろん、この形式のクエリは利用可能ですifカラムはフルテキストインデックスにあります。そうでない場合は、最初の形式のみが利用可能です。

LIKEを使用した最初のクエリはワイルドカードで始まるため、インデックスを使用できません。したがって、常に全テーブルスキャンが必要になります。


CONTAINSクエリは次のようになります。

SELECT * FROM table WHERE CONTAINS(Column, 'test');
144

_は_ を含む単一の単語やフレーズ、互いに一定の距離内にある単語、またはSQL Serverでの加重一致に対する完全一致またはあいまい一致(厳密ではない)の一致を検索します。

CONTAINSは検索することができます:

  1. 言葉やフレーズ。
  2. 単語または語句のプレフィックス。
  3. 別の言葉の近くの言葉。
  4. 別の単語から活用的に生成されたWord(たとえば、Wordドライブは、ドライブの活用語幹、ドライブ、ドライブ、およびドライブ)。
  5. シソーラスを使用している別の単語の同義語である単語(たとえば、「金属」という単語には「アルミニウム」や「鋼」などの同義語があります)。

注:CONTAINSは高速で、更新されたフルテキストインデックスがある場合は機能します。あなたが正確な正規表現の一致が欲しいなら、あなたはlikeを使うことができます。

23
Somnath Muluk

両方のクエリをSQL Server 2012インスタンスで実行したので、最初のクエリが最も速いことを確認できます。

LIKEキーワードを使用した照会は、クラスター化索引スキャンを示しました。

CONTAINSは、全文一致とマージ結合のための追加演算子を使ったクラスタ化インデックススキャンも行いました。

Plan

13
MI C

クエリのadventure-works.comにダッシュ( " - ")が含まれているため、CONTAINSは時間がかかりMergeを使用したと思います。

ダッシュはWordの改行なので、CONTAINSはフルテキストインデックスでadventureを検索し、works.comを検索して結果をマージしました。

5
Omri Valfer

また、これから変更してみてください。

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

これに:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

前者は " これはテスト "や " テストケースは計画 "のような値のレコードを見つけるでしょう。

後者はまた " 私はこれをテストしています "と " これが最大です "のような値を持つレコードを見つけるでしょう。

3
John Doe