【发布时间】:2009-07-02 10:00:51
【问题描述】:
我在某处听说在日期列上声明索引不利于性能,但我在互联网上找不到任何参考资料。
建议?
【问题讨论】:
标签: sql sql-server sql-server-2008
我在某处听说在日期列上声明索引不利于性能,但我在互联网上找不到任何参考资料。
建议?
【问题讨论】:
标签: sql sql-server sql-server-2008
SQL Server 2005 中的DateTime(以及SQL Server 2008 中)存储为8-byte 值,包括:
4 字节(日期部分)中自 Jan 1, 1900 以来的天数4 字节(时间部分)的1/300 滴答数索引这个值是完全可以的。
【讨论】:
这将取决于针对数据库运行的活动模式。如果您针对 DateTime 执行大量 WHERE,则索引可能会有所帮助。如果您正在执行大量插入,并且它们的顺序不连续,那么您的插入速度可能会影响更新索引。
与所有性能问题一样,在更改前后使用典型工作负载测试性能,这是真正了解更改是否有帮助的唯一方法。
【讨论】:
为什么不能在某个日期创建索引?
如果您定期对该列执行搜索或排序,我认为在其上放置索引是个好主意。
搜索会更快;更新和插入会稍微慢一些,因为 Sql Server 也必须维护索引,但是这种“性能损失”是如此微不足道,以至于您甚至都不会注意到它
【讨论】:
DateTime 数据类型存储为数字,因此其上的索引没有性能问题。
【讨论】:
在日期字段上放置索引非常好。
您需要问自己的问题是,在该日期字段上放置索引会给您带来什么好处?
例如,许多存储过程在 WHERE 子句中使用该字段,因此在其中放置索引可能有助于提高性能。
【讨论】:
如果您的数据基于此日期并且主要使用日期操作进行搜索,那么最好将日期设置为表的聚集索引中的第一列。这样一来,所有数据都将根据该日期值组织在一个堆中,从而实现基于日期的快速查询。
http://msdn.microsoft.com/en-us/library/aa933131(SQL.80).aspx
默认情况下,表的主键创建为聚集索引。这可能是也可能不是您想要的。您可以在表属性编辑器中更改 SQL Server Management Studio 中的索引类型。
【讨论】:
虽然让索引提防经常过时的统计信息和不一致的性能差异可能是件好事。 http://sqlbits.wordpress.com/2009/08/23/tip-3-beware-of-indexes-on-datetime-columns/
【讨论】: