0


0

インデックスが使用されていない+ SQL Server 2005

これが私の質問です

Declare @StartDateTime datetime, @EndDateTime datetime

Select @StartDateTime = '2010-11-15', @EndDateTime = '2010-11-16'

Select PracticeCode, AccountNo, ProcCd, Modifier , ChargeDos, Paid as Amt, CreatedDate,
     case When Paid > 0 then 'P'
          When Paid = 0 and WrittenOff = DueAmt then 'A'
          Else 'O'
     End as Status
     From Trn_Postings
     Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime
            --and ManualOverride in ('S','F','X','G','O')
            and ManualOverride in ('N','U')

編集:作成日は、作成されたレコードの日付と時刻を含む日時列です

CreatedDateとManualOverrideの両方に個別のインデックスがあります。 ただし、実行計画にはクラスター化インデックススキャンが表示されます。 このテーブルには100万件近くの記録があり、近い将来に4〜5倍に成長する可能性があります。

最も驚くべき部分は、次のようにwhere句を変更すると、両方のインデックスが使用されることです。 理由がわかりません。

     Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime
            and ManualOverride in ('S','F','X','G','O')
            --and ManualOverride in ('N','U')

インデックスを使用するようにSQLを作成するにはどうすればよいですか…​

さらに、* Not in *句を使用すると、インデックスは使用されません。

3 回答


0


「where」句に一致するすべての行が見つかった場合、クラスター化インデックスに戻ってデータを取得する必要があるため、大量のデータが返される場合は、すべてをステップスルーしてプルする方が効率的かもしれません必要な行を取り出します。


0


統計の更新を検討してください。

update statistics Trn_Postings with fullscan


0


CreatedDateとManualOverrideで複合インデックスを作成することをお勧めします。 インデックスを使用して両方の条件が満たされると、オプティマイザーが実行しているように見えます。

しかし、クエリの一部を満たすためにクラスター化インデックスを使用する必要があることがわかったら、他のインデックスを無視しているように見えます。 COST(CreatedDateインデックス+ CIルックアップ+条件を使用)> COST(CIのスキャン)を決定しました。 それは間違っていますが、時々これが起こります。 おそらく両方の列のインデックス(最初にCreatedDate)が使用されるでしょう。 または、INDEX http://msdn.microsoft.com/en-us/library/ms181714.aspx [クエリヒント]を使用して、強制的に実行することもできます。 ヒントを無視することも選択できます。