SQL Server LIKE vs CONTAINS 完全ガイド:パフォーマンス、使い分け、サンプルコード
SQL Server における LIKE 演算子と CONTAINS 演算子の比較
SQL Server で文字列検索を行う際、LIKE
演算子と CONTAINS
演算子のどちらを使用するべきか悩む場合があります。 それぞれ異なる動作とパフォーマンス特性を持つため、状況に応じて適切な演算子を選択することが重要です。
LIKE
演算子は、ワイルドカード文字を使用してパターンマッチングを行う演算子です。 以下のような特徴があります。
- ワイルドカード文字
%
と_
を使用して、部分一致や前方一致、後方一致などの検索を実行できます。 - インデックスを使用できないため、テーブル全体をスキャンする必要があるため、パフォーマンスが低下する可能性があります。
CONTAINS
演算子は、全文検索機能を使用して、単語やフレーズを含む行を検索する演算子です。 以下のような特徴があります。
- ワイルドカード文字を使用せずに、単語やフレーズを含む行を検索できます。
- フルテキストインデックスを使用するため、
LIKE
演算子よりも高速に検索を実行できます。 - 部分一致や前方一致、後方一致などの検索は直接実行できません。
パフォーマンス比較
一般的に、CONTAINS
演算子は LIKE
演算子よりも高速に検索を実行できます。 これは、CONTAINS
演算子がフルテキストインデックスを使用するためです。 フルテキストインデックスは、単語やフレーズの位置情報などを保存するため、効率的な検索が可能になります。
ただし、CONTAINS
演算子は以下の場合、LIKE
演算子よりも遅くなる可能性があります。
- 検索条件にワイルドカード文字が含まれている場合
- フルテキストインデックスが作成されていない場合
使い分け
LIKE
演算子と CONTAINS
演算子は、それぞれ異なる特徴を持つため、状況に応じて適切な演算を選択する必要があります。
- ワイルドカード文字を使用してパターンマッチングを行う場合は、
LIKE
演算子を使用する必要があります。 - ワイルドカード文字を使用せずに、単語やフレーズを含む行を検索する場合は、
CONTAINS
演算子を使用する必要があります。
補足
- 上記は基本的な比較であり、実際のパフォーマンスはデータ量や検索条件などによって異なる場合があります。
LIKE 演算子
SELECT *
FROM Products
WHERE ProductName LIKE '%自転車%';
CONTAINS 演算子
SELECT *
FROM Products
WHERE CONTAINS(ProductName, '自転車');
上記のコードは、ProductName
列に "自転車" という単語を含むすべての製品を検索します。
LIKE
演算子とCONTAINS
演算子は、組み合わせて使用することもできます。CONTAINS
演算子には、前方一致、後方一致、部分一致などのオプションがあります。 詳細については、SQL Server のドキュメントを参照してください。
LIKE と CONTAINS 以外の文字列検索方法
FULLTEXT 構文は、CONTAINS 演算子と同様に全文検索機能を使用する検索方法です。 CONTAINS 演算子よりも詳細な検索条件を指定できます。
SELECT *
FROM Products
WHERE CONTAINS(ProductName, '自転車')
AND FREETEXT(Description, '高性能');
上記のコードは、ProductName
列に "自転車" という単語を含む製品のうち、Description
列に "高性能" という単語を含む製品を検索します。
PATINDEX 関数は、文字列中にパターンが存在するかどうかを判断する関数です。
SELECT *
FROM Products
WHERE PATINDEX('%自転車%', ProductName) > 0;
CHARINDEX 関数は、文字列中に指定された文字が最初に登場する位置を返す関数です。
SELECT *
FROM Products
WHERE CHARINDEX('自転車', ProductName) > 0;
SOUNDEX 関数は、2 つの文字列の発音が似ているかどうかを判断する関数です。
SELECT *
FROM Products
WHERE SOUNDEX(ProductName) = SOUNDEX('自転車');
DIFFERENCE 関数は、2 つの文字列の差分を返す関数です。
SELECT *
FROM Products
WHERE DIFFERENCE(ProductName, '自転車') < 3;
LIKE と CONTAINS 以外にも、SQL Server で文字列検索を行う方法はいくつかあります。 それぞれの方法の特徴を理解し、状況に応じて適切な方法を選択することが重要です。
sql-server performance contains