次のようなクエリがあります。
select top(10) * from dbo.myTable where DisplayName like 'farm%'
ワイルドカードが末尾にあるため、DisplayName でインデックス シークが発生します。ただし、これを行う場合は同じではありません。
declare @val varchar(200) = 'farm'
select top(10) * from dbo.myTable where DisplayName like @val + '%'
またはこれ:
declare @val varchar(200) = 'farm%'
select top(10) * from dbo.myTable where DisplayName like @val
このような場合、SQL は非常に低速なインデックス スキャン操作にフォールバックします。配置されている値は実行時に提供されるパラメーターであるため、明らかに最初のクエリを目的に使用することはできません。
私ができる方法はありますか:
- SQL インデックスが値をシークしていることを確認します。
- このロジックをストアド プロシージャにプリコンパイルします。クエリは高速である必要があるため、実行ごとに再コンパイルを強制するメソッドに頼る必要はありません (コンパイルのオーバーヘッド + インデックス シークはインデックス スキャンよりも高速ですが)。
ワイルドカード文字の有無が実行計画に影響することは認識していますが、SQL は、クエリ #2 のようにワイルドカードを値に連結したとしても、ワイルドカードが常に使用されていることを認識していないようです。