シナリオをより明確にするために、シナリオを単純化しようとしています。
次のようなテーブルがあるとしましょう。
create table documents
(DocumentId uniqueidentifier primary key,
--valid values are D=Draft,P=Published,R=Revised
documentType char(1) not null,
PublisherId,
....
これには、ドラフトを除外するための述語DocumentType != 'D'を持つ簡単なビューがあります 。
PublisherId in (.....) や date > ... など、ほとんどのクエリはこのビューに対して実行されます。
問題は、このテーブルに 500.000 のレコードがあり、どれもDraftのタイプではないことです。
とにかく、クエリを実行して Actual Plan を取得すると、SMS は、DocumentType、PublisherId のインデックスが欠落していることを通知し、さらに 50 ほどのフィールドを追加する必要があることを通知します。
SQL Query Optimizer が DocumentType フィールドの統計を保持し、Draft タイプのドキュメントが存在しないことを認識し、このクエリのフラグをチェックしないことを期待しています。統計を調べてみました
DBCC SHOW_STATISTICS ('Documents','DocumentType')
そしてそれは統計を持っています。このシナリオで SQL クエリ オプティマイザーがこのフィールドの値チェックをスキップし、別のインデックスで動作するようにするにはどうすればよいですか。
ところで、私は EntityFramework を使用しているため、SQL 生成をあまり制御できません。MSSQL のバージョンは 2012 です。
編集: フィルターされたインデックスを調べる