我在一个表中有 2.7 亿条记录。目前我在日期列上有一个非聚集索引。99% 的时间我使用日期 > 2008 年 1 月 1 日的行......这意味着其中有 1.4 亿。我正在使用 SQL Server 2008。在这种情况下,使用过滤索引而不是普通的非聚集索引是否有益?
此外,如果我使用“日期”数据类型而不是“日期时间”,它有多大用处?
提前致谢 !
我在一个表中有 2.7 亿条记录。目前我在日期列上有一个非聚集索引。99% 的时间我使用日期 > 2008 年 1 月 1 日的行......这意味着其中有 1.4 亿。我正在使用 SQL Server 2008。在这种情况下,使用过滤索引而不是普通的非聚集索引是否有益?
此外,如果我使用“日期”数据类型而不是“日期时间”,它有多大用处?
提前致谢 !
是的,过滤后的非聚集索引将用于:
WHERE date ='20101016'
(过滤掉一天,几条记录从270M)。SELECT COUNT(date) FROM ... WHERE date BETWEEN '20080101' AND '20090101'
就是这样。任何更复杂的查询都不会使用非聚集索引,过滤或未过滤,因为它会达到索引临界点。
因此,总而言之,对于该表上具有WHERE date > '200080101'
子句的一般查询,您建议的过滤非聚集索引将有所帮助......没有。此外,即使您将date
作为聚集索引最左边的键移动(这是时间范围查询时间序列的典型组织,就像您的表似乎是,您应该自己考虑),过滤掉“仅”140M 270M 算不上优化。
正确的索引是一个复杂的话题。我敦促您阅读此 MSDN 链接中的所有内容,包括所有子章节:设计索引。这将为您提供最基本的知识,以了解一些更复杂的文章,并能够从胡说八道中辨别出大量可用的错误信息。
是的,过滤后的索引可能会有所帮助。如果您有一个通用过滤器,例如“WHERE MyColumn IS NOT NULL”来获取 1.4 亿行,那么这可能是创建索引的方式。索引将使用与条件匹配的键构建,这使得索引数据集更小。
在处理大量数据时,日期键(3 字节存储)也可能比日期时间(8 字节存储)更好。但是,只有当您不需要从 datetime 数据类型中获得的精度(时间)时,它才会有所帮助。