1. ホーム
  2. sql

[解決済み] SQLの'like'と'='のパフォーマンス

2023-03-27 17:26:40

質問

この質問 は、私が疑問に思っていることを回避していますが、回答は正確にそれを解決していません。

それは、どうやら 一般に ワイルドカードを使用する場合、'=' は 'like' よりも高速です。これは従来の常識のように思われます。しかし、限られた数の異なる固定、ハードコード、varchar 識別子を含む列があり、そのうちの 1 つに一致するすべての行を選択したいとします。

select * from table where value like 'abc%'

select * from table where value = 'abcdefghijklmn'

'=' が文字列全体を比較しなければならないのに対し、'like' は最初の3文字だけをテストして一致を見つける必要があるはずです。この場合、他の条件がすべて同じであれば、'like' が有利になるように思われます。

これは一般的で学術的な質問として意図されているので、どのDBでも問題ないはずですが、SQL Server 2005を使用して発生しました。

どのように解決するのですか?

参照 https://web.archive.org/web/20150209022016/http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx

そこから引用。

<ブロッククオート

を使ったインデックスの使用に関するルールは以下の通りです。 を使ったインデックス使用のルールは、ゆるやかにこのようなものです。

  • フィルタ基準でequals =を使用し、フィールドがインデックス化されている場合 を使用し、フィールドがインデックス化されている場合、ほとんどの場合 INDEX/CLUSTEREDを使用する可能性が高いです。 INDEX SEEK

  • フィルター基準がLIKE.を使用している場合 を使用し、ワイルドカードを使用しない場合 (たとえば、Web レポートで ウェブレポートのパラメータに を持つことができるが、代わりに完全な のような場合)、インデックスを使用する可能性は#1 と同じようにインデックスを使用します。 増加するコストは はほとんどありません。

  • フィルタリングの基準がLIKEを使用しているが を使用し、最初にワイルドカードを使用する場合 (たとえば Name0 LIKE '%UTER' のように)、インデックスが使用される可能性はかなり低くなります。 インデックスを使用する可能性は低くなりますが、それでも 少なくとも、インデックスの全体または部分的な範囲に対して を実行するかもしれません。

  • しかし、もしフィルタの基準が LIKE を使っているが、最初は文字列で始まり で始まり、その後にワイルドカードがある場合 (Name0 LIKE 'COMP%ER' のように) の場合は、SQL はINDEX SEEKを使用して、同じ行を素早く見つけることができます。 同じ最初の文字を持つ行を見つけるために を持つ行を素早く見つけ、そして SQLはINDEX SEEKを使用して、同じ最初の文字を持つ行を素早く見つけ、それらの行を通して完全に一致するものを探します。

(また、SQLエンジンは はまだインデックスを期待していたようには使っていないかもしれません。 SQLエンジンは、クエリで他に何が起こっているかによって クエリで他に何が起こっているか、そして どのテーブルと結合しているかによって異なります。 SQLエンジンは SQLエンジンは クエリを少し書き換える権利を有します。 SQL エンジンは、最も効率的と思われる方法でデータを取得するために SQLエンジンは、最も効率的と思われる方法でデータを取得するために、クエリを少し書き換える権利を有します。 INDEX SEEK の代わりに INDEX SCAN を含むかもしれません)。