过滤索引与正常非聚簇索引

时间:2010-10-16 00:44:17

标签: sql-server indexing non-clustered-index filtered-index

我在表中有2.7亿条记录。目前我在日期列中有一个非聚集索引。 99%的时间我使用日期>行1/1/2008 ......这意味着它有1.4亿。 我正在使用SQL Server 2008.在这种情况下,使用除正常非聚集索引之外的过滤索引是否有益?

另外,如果我使用“date”数据类型而不是“datetime”它有多好处呢?

提前致谢!

2 个答案:

答案 0 :(得分:4)

是的,过滤后的非聚集索引将用于:

  • 查询比扫描非常少的记录,例如。有WHERE date ='20101016'(过滤一天,270M的记录很少)。
  • 查询而非扫描较大的日期范围,但仅触摸 日期字段:SELECT COUNT(date) FROM ... WHERE date BETWEEN '20080101' AND '20090101'

就是这样。任何更复杂的查询都使用非聚集索引,已过滤或未过滤,因为它会点击index tipping point

总而言之,对于此表中具有WHERE date > '200080101'子句的一般查询,您建议的过滤非聚集索引将有助于... 。此外,即使您将date移动为聚集索引最左侧的键(这是时间范围查询时间序列的典型组织,就像您的表似乎是,并且您应该自己考虑它),过滤掉'只有270M中的140M几乎不是优化。

正确的索引是一个复杂的主题。我建议您阅读此MSDN链接中的所有,包括所有子章节:Designing Indexes。这将为您提供最简单的知识,无法理解一些更复杂的文章,并能够从过多的错误信息中辨别出正确的信息。

答案 1 :(得分:1)

是的,过滤后的索引可能会有所帮助。如果你有一个通用的过滤器,例如“WHERE MyColumn IS NOT NULL”来获得1.4亿行,那么这可能是创建索引的方法。索引将使用与条件匹配的键构建,这样就可以生成更小的索引数据集。

当您处理大量数据时,日期键(3字节存储)也可能比datetime(8字节存储)更好。但是,只有在您不需要从日期时间数据类型获得的精度(时间)时才有用。