次のクエリのどれが速いです(LIKE対CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
または
SELECT * FROM table WHERE Contains(Column, "test");
2番目( CONTAINS
を意味し、実際に有効なクエリに入れると仮定した場合)は、some形式のインデックス(この場合はフルテキストインデックス)を使用できるため、高速になります。もちろん、この形式のクエリは利用可能ですifカラムはフルテキストインデックスにあります。そうでない場合は、最初の形式のみが利用可能です。
LIKEを使用した最初のクエリはワイルドカードで始まるため、インデックスを使用できません。したがって、常に全テーブルスキャンが必要になります。
CONTAINS
クエリは次のようになります。
SELECT * FROM table WHERE CONTAINS(Column, 'test');
_は_ を含む単一の単語やフレーズ、互いに一定の距離内にある単語、またはSQL Serverでの加重一致に対する完全一致またはあいまい一致(厳密ではない)の一致を検索します。
CONTAINSは検索することができます:
両方のクエリをSQL Server 2012インスタンスで実行したので、最初のクエリが最も速いことを確認できます。
LIKE
キーワードを使用した照会は、クラスター化索引スキャンを示しました。
CONTAINS
は、全文一致とマージ結合のための追加演算子を使ったクラスタ化インデックススキャンも行いました。
クエリのadventure-works.com
にダッシュ( " - ")が含まれているため、CONTAINS
は時間がかかりMerge
を使用したと思います。
ダッシュはWordの改行なので、CONTAINS
はフルテキストインデックスでadventure
を検索し、works.com
を検索して結果をマージしました。
また、これから変更してみてください。
SELECT * FROM table WHERE Contains(Column, "test") > 0;
これに:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
前者は " これはテスト "や " テストケースは計画 "のような値のレコードを見つけるでしょう。
後者はまた " 私はこれをテストしています "と " これが最大です "のような値を持つレコードを見つけるでしょう。