我有几个表,必须根据开始和结束日期进行连接,例如...
SELECT *
FROM [t1]
JOIN [t2]
ON [t2].[start] BETWEEN [t1].[start] AND [t1].[stop]
OR [t2].[stop] BETWEEN [t1].[start] AND [t1].[stop]
OR [t2].[start] < [t1].[start] and [t2].[stop] > [t1].[stop]这些表可能在数百万行中。
我可以选择将开始/停止存储为datetime2和/或bigint(从纪元开始的纳秒)。考虑到这个选项-如果索引的话使用bigint会有性能提升吗?
任何一种方法都有优缺点吗?
我预计整数方法会更快-
发布于 2013-01-10 13:33:52
使用datetime2。除了“更容易被人类阅读”之外,更容易被人类编程。如果不使用date类型来表示日期,那么与外部时间(例如getdate() )相比,您将在计算时间间隔、连接到其他表等方面遇到问题。
就效率而言,为了便于比较,服务器几乎肯定会将所有date类型视为整数。唯一的速度优势可能对您开放,取决于您是否通常关心秒,将是集群在smalldatetime上,因为它是4个字节。您仍然可以将高分辨率部分保留为单独的real。
发布于 2013-01-09 16:50:16
只要使用datetime2类型,就可能没有区别,因为两种类型在大小上相似(datetime2 -- 6到8字节,bigint -- 8字节)。
我假设IO成本将是唯一的瓶颈,因此它取决于您比较了多少记录(要读取的记录)以及索引将如何存储datetime2类型。
我会在你的例子中测试和比较这两个选项,并选择更好的一个,记住datetime更容易被人类阅读。
https://stackoverflow.com/questions/14231119
复制相似问题