索引未使用+ sql server 2005

时间:2010-11-16 07:30:43

标签: sql-server-2005 query-optimization sql-execution-plan

这是我的查询

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')

编辑:创建日期是一个日期时间列,其中包含日期&amp;创建记录的时间

我在CreatedDate和ManualOverride上都有单独的索引。但执行计划显示聚簇索引扫描。该表有近百万的记录,在不久的将来可以增长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 :(得分:0)

鉴于对于找到的每一行都匹配where子句,它必须返回聚集索引才能获取数据,如果返回了大量数据,则可能更有效率通过这一切并拉出所需的行。

答案 1 :(得分:0)

考虑更新统计信息:

update statistics Trn_Postings with fullscan

答案 2 :(得分:0)

我建议在CreatedDate和ManualOverride上创建一个复合索引。当使用索引可以满足这两个条件时,这就是优化器似乎正在做的事情。

但是一旦它知道必须使用聚集索引来满足部分查询,它就会忽略其他索引。它已决定COST(使用CreatedDate指数+ CI查找+条件)&gt;成本(扫描CI)。这是错的,但有时会发生这种情况。可能会使用两个列的索引(CreatedDate优先)。或者您可以尝试使用INDEX query hint来强制它。它仍然可以选择忽略提示。