我在表中有2.7亿条记录。目前我在日期列中有一个非聚集索引。 99%的时间我使用日期>行1/1/2008 ......这意味着它有1.4亿。 我正在使用SQL Server 2008.在这种情况下,使用除正常非聚集索引之外的过滤索引是否有益?
另外,如果我使用“date”数据类型而不是“datetime”它有多好处呢?
提前致谢!
答案 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字节存储)更好。但是,只有在您不需要从日期时间数据类型获得的精度(时间)时才有用。