2010-10-16 57 views
3

我在表中有2.7亿条记录。目前,我在日期列中有一个非聚集索引。 99%的时间我使用日期> 1/1/2008行,这意味着1.4亿行。 我正在使用SQL Server 2008.在这种情况下,使用非正常非聚集索引以外的筛选索引会有好处吗?已过滤索引与正常非聚簇索引

此外,如果我使用“日期”数据类型而不是“日期时间”它有多好处?

在此先感谢!

回答

4

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

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

而且仅此而已。任何更复杂的查询将而不是使用非聚集索引,过滤或不过滤,因为它会击中index tipping point

所以在最后,对于一般的查询,在该表上有一个WHERE date > '200080101'条款你提出的过滤非聚集索引将帮助...... 什么。此外,即使您将date作为聚簇索引最左边的键(这是典型的时间范围查询时间序列组织,例如您的表似乎是,并且您应该自己考虑它),将'only'140M过滤掉270M几乎不是优化。

适当的索引是一个复杂的主题。我强烈建议您在本MSDN链接中阅读的所有内容,其中包括所有子章节:Designing Indexes。这会给你最基本的知识去理解一些更复杂的文章,并且能够从大量的错误信息中辨别出正确的答案。

1

是的,过滤后的索引可能会有帮助。如果你有一个通用的过滤器,例如“WHERE MyColumn IS NOT NULL”来获得1.4亿行,那么这可能是创建索引的方式。该索引将使用与标准相匹配的密钥来构建,这使得索引数据的集合更小。

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

+0

此列不为空。它是多么有益..?任何想法 ?我的意思是我可以获得多少时间。我需要定量分析。 – Relativity 2010-10-16 00:51:16

+0

您可以使用任何有效的条件来定义过滤后的索引。例如,您可以基于“MyDateColumn>'1/1/2009'”创建已过滤的索引,并且只会为日期大于该日期的数据编制索引。因此,在确定是否使用过滤索引时,可空性并不重要。 – bobs 2010-10-16 00:53:24

+0

重要的是,您创建对于您将要运行的查询有用的索引。你提到的每一点都很重要,你必须用这些查询来评估每个索引选项。 – bobs 2010-10-16 00:57:14

相关问题