[解決済み] SQLの'like'と'='のパフォーマンス
質問
この質問 は、私が疑問に思っていることを回避していますが、回答は正確にそれを解決していません。
それは、どうやら 一般に ワイルドカードを使用する場合、'=' は 'like' よりも高速です。これは従来の常識のように思われます。しかし、限られた数の異なる固定、ハードコード、varchar 識別子を含む列があり、そのうちの 1 つに一致するすべての行を選択したいとします。
select * from table where value like 'abc%'
と
select * from table where value = 'abcdefghijklmn'
'=' が文字列全体を比較しなければならないのに対し、'like' は最初の3文字だけをテストして一致を見つける必要があるはずです。この場合、他の条件がすべて同じであれば、'like' が有利になるように思われます。
これは一般的で学術的な質問として意図されているので、どのDBでも問題ないはずですが、SQL Server 2005を使用して発生しました。
どのように解決するのですか?
そこから引用。
<ブロッククオートを使ったインデックスの使用に関するルールは以下の通りです。 を使ったインデックス使用のルールは、ゆるやかにこのようなものです。
-
フィルタ基準で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 を含むかもしれません)。
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 最初の行への結合方法
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] データベースのインデックス作成はどのように行われるのですか?[クローズド]
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?
-
[解決済み] [解答】イコール(=)vsライク(LIKE)
-
[解決済み] SQLです。文字列が等しくない場合の処理方法