2012-03-05 4 views
2

Sql Serverに関する多くの記事では、クエリを書くときにNOTとLIKE演算子を使用しないでください。索引付けは適用されません。SQL ServerのLIKEとNOT演算子では索引付けは機能しません。これはMYTHです

例えば、

SELECT [CityId] 
     ,[CityName] 
     ,[StateId] 
    FROM [LIMS].[dbo].[City] 
    WHERE CityId NOT IN(1, 2) 

上記のクエリを実行した結果、インデックス作成がレコードのフィルタリングに使用されていたことが判明しました。 以下は実行計画であり、クラスタ化インデックスシークを明確に示しています。これは私が思って読んでいたものにはっきりと違反しています。

enter image description here

は、私の以前の理解が間違っていましたか?

+1

これは検索語句に依存します。つまり、LIKE演算子の場合、この記事をチェックしてください... http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-パフォーマンスチューニング –

+0

@BhrugeshPatel:既にその記事を見ました。私のオフィスでも、NOTとLIKE演算子を避けることを明確に述べた文書を見ました。 LIKEはかなりわかりやすいですが、なぜインデックスが使われないのか、この部分は私のために消化するのが難しいです。 –

+0

さて、LIKEの場合、検索が%で始まる場合、インデックスを使用する必要はありません。それ以外の場合は、検索文字列の先頭が固定文字であるため、インデックスの使用は非常に妥当です。ジョン氏の言ったように、どのデータベースもアルゴリズムに従って利用可能な最良の方法になるでしょう。 –

答えて

2

このような索引付けはLIKEとNOT演算子では機能しません。 SQL Server(またはそのような有能なRDBMS)は、の中で最も良いアルゴリズムを使用します。の場合です。したがって、もしが手動でインデックスを探すことができれば、SQL Serverも可能です。

指定した特定の例では、ほとんどのレコードが返されるため、シークがスキャンより効率的かどうかは不明です。だから、私はその特定の実行計画をあまり読んでいないでしょう。

ボトムライン:データベースシステムがデータとインデックスをどのように内部的に整理しているかを理解して、経験則に頼る必要はありません。

関連する問題