这是我的查询
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 子句,则不要使用索引。
答案 0 :(得分:0)
鉴于对于找到的每一行都匹配where
子句,它必须返回聚集索引才能获取数据,如果返回了大量数据,则可能更有效率通过这一切并拉出所需的行。
答案 1 :(得分:0)
考虑更新统计信息:
update statistics Trn_Postings with fullscan
答案 2 :(得分:0)
我建议在CreatedDate和ManualOverride上创建一个复合索引。当使用索引可以满足这两个条件时,这就是优化器似乎正在做的事情。
但是一旦它知道必须使用聚集索引来满足部分查询,它就会忽略其他索引。它已决定COST(使用CreatedDate指数+ CI查找+条件)&gt;成本(扫描CI)。这是错的,但有时会发生这种情况。可能会使用两个列的索引(CreatedDate优先)。或者您可以尝试使用INDEX query hint来强制它。它仍然可以选择忽略提示。