索引未使用 + sql server 2005

Posted

技术标签:

【中文标题】索引未使用 + sql server 2005【英文标题】:Index not getting used + sql server 2005 【发布时间】:2011-05-10 16:06:58 【问题描述】:

这是我的查询

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 上都有单独的索引。但执行计划显示聚集索引扫描。该表有近百万条记录,在不久的将来可以增长 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 子句,则不会使用索引。

【问题讨论】:

就目前而言,优化器确实考虑索引。在第一种情况下不使用索引可能是错误的,但很可能不是。你能发布这两种情况的计划吗? 使用索引并不总能获得更好的性能。强制编译器使用索引会变慢的一个简单情况是执行返回 all 行的选择。 select ManualOverride,COUNT(*) from Trn_Postings group by ManualOverride。如果 N 和 U 代表此列中的大多数值,则意味着索引对查询没有那么有用,因此优化器不太可能使用它。 也许分解成 5 个 UNION 会产生更好的结果。它在某些情况下对我有用。请参阅 Quassnoi 回答的第一个案例:***.com/questions/1069346/… @Damien。当然 N 和 U 构成主要部分,但是当数据分布在 5 个月内但我只要求一天时,是什么阻止了它在“CreatedDate”上使用索引。 【参考方案1】:

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

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

【讨论】:

看起来我必须忍受它:-(...“使用索引”表提示仅在 Sql Server 2008 中可用...我们仍然使用 Sql server 2005...跨度> @The King - 在 2005 年以下,您仍然可以提供 INDEX 提示 - 使用 OPTION 子句并指定表提示。 msdn.microsoft.com/en-us/library/ms187373(v=SQL.90).aspx【参考方案2】:

鉴于对于找到与where 子句匹配的每一行,它都必须返回聚集索引以获取数据,如果返回大量数据,则单步执行可能更有效all 并取出它需要的行。

【讨论】:

我的查询返回了 1000 万条记录中的近 10000 条记录,仅占总记录的 1%...【参考方案3】:

考虑更新统计数据:

update statistics Trn_Postings with fullscan

【讨论】:

我按照你的建议做了......没有任何改变。

以上是关于索引未使用 + sql server 2005的主要内容,如果未能解决你的问题,请参考以下文章

识别 Microsoft SQL Server 2005 中未使用的对象

sql server 2005 快速创建索引公式所需的空间

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

SQL Server 2005 IsNumeric 未捕获“0310D45”

移动/复制 SQL Server 2005 全文索引

SQL Server 2005 事务复制无法发布包含索引创建的存储过程