、それが具体的に多くを依存:)
あなた断定列がどのくらいの行の合計サイズのですか?いくつの行が一致すると思われますか?述語と一致するすべての行、または上位1行または上位n行だけを返す必要がありますか?
選択性/一意性(返される行が少ない)で値を検索し、述語列が行サイズ全体の小さな部分である場合、索引は非常に便利です。それでもスキャンされますが、索引はソース表よりページあたりの行数が多くなります。あなたは、実際の実行計画を見れば
create table t1 (v1 varchar(100), b1 varbinary(8000))
go
--add 10k rows of filler
insert t1 values ('abc123def', cast(replicate('a', 8000) as varbinary(8000)))
go 10000
--add 1 row to find
insert t1 values ('abc456def', cast(replicate('a', 8000) as varbinary(8000)))
go
set statistics io on
go
select * from t1 where v1 like '%456%'
--shows 10001 logical reads
--create index that only contains the column(s) to search across
create index t1i1 on t1(v1)
go
select * from t1 where v1 like '%456%'
--or can force to
--shows 37 logical reads
あなたはエンジンがインデックスをスキャンしていた見ることができます:ここでは
は合計行サイズは全体の検索するには、列のサイズよりもはるかに大きい場合の例であります一致する行のブックマークルックアップ。または、このプランを単独で使用することを決定していない場合は、オプティマイザにインデックスを直接使用するよう指示できます。select * from t1(index(t1i1))ここで、v1は '%456%'のようになります。
高度に選択的な数少ない列だけを検索する列がある場合は、複数の索引を作成し、縮小方法を使用できます。例えば。あなたの選択性の高いインデックスからIDのセット(またはあなたのPKが何であれ)を決定し、その小さなPKセットに対するフィルターを使って、あまり選択的でない列を検索します。
大量の行を返す必要がある場合は、ほとんどの場合、テーブルスキャンを使用する方がよいでしょう。
可能な最適化は、テーブル定義の詳細とデータの選択性に大きく依存します。
HTH! -アドリアン
ありがとう、それは私が残念なことに思ったものです。スピードアップに役立ついくつかのLIKE節を削除しました。 – schooner