2017-06-06 7 views
2

現在のインデックスは次のとおりです。SQL Serverフィルタリングインデックスのパフォーマンス

CREATE UNIQUE NONCLUSTERED INDEX [CDPAYAPP_INDEX03] ON [dbo].[CDPAYAPP] 
(
    [CLSVC_ID] ASC, 
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) 

残念ながら、私たちのクライアントのいくつかをCLSVC_IDの値はカップル万人の行のうち行の100K以上のためにゼロにすることができます。このカーディナリティーは、オプティマイザが索引を最適ではないと見なすことがあり、その結果表のスキャンが行われるように見えます。 1日に複数回統計情報を更新すると、必ずしも役立つことはありません。

私はFILTERING INDEX句を適用しようとしました。

create UNIQUE NONCLUSTERED index CDPAYAPP_INDEX3A ON CDPAYAPP (CLSVC_ID, ID) 
WHERE CLSVC_ID > 0; 

しかし、私は2つのインデックス列の外に任意の列を要求した場合、それは元の索引ではないフィルターのインデックスを使用していることに気づきました。インデックスの列のみを選択すると、フィルタされたインデックスが使用されます。

なぜですか?

+0

であることを知っているだろう、あなたは私たちにそのクエリプランを最適化するためのクエリを与えることができますか? https://www.brentozar.com/pastetheplan/ – Hybris95

答えて

1

フィルタ指数で(DML文が実行されたときにも、CREATE INDEXを...と)作業する場合、[1]、我々は以下の設定に従っています

SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, QUOTED_IDENTIFIER, ... etc. ... ON 
SET NUMERIC_ROUNDABORT OFF 

ソース(フィルタリングのためのセクション[必須SETオプションを参照してください。私はこれらの設定をCREATE INDEX中に使用しますが、SELECT/I/U/D実行中にも使用します。 注:ANSI_NULLSおよびQUOTED_IDENTIFIERは、CREATE [PROCEDURE] ...キーワードの前にSQLモジュール(ストアドプロシージャなど)の外にあり、SQLモジュール内の他の設定にする必要があります。

[2] SQL Serverパラメータ化されていますか:WHERE CLSVC_ID > @p @pは0より大きい値をとりますか?はい、私は、次の解決策使用している場合:この方法で

WHERE CLSVC_ID > 0 -- Predicate used for filtered index 
AND CLSVC_ID > @p 

を、SQL Serverが@pパラメータは常に> 0

関連する問題