1

我有几个必须根据开始和停止日期连接的表,例如......

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 是否会提高性能?

任何一种方法的优点/缺点?

我希望整数方法更快 -

4

2 回答 2

4

使用datetime2. 除了“更容易被人阅读”之外,更容易被人编程。如果您不使用日期类型来表示日期,那么在计算间隔、加入其他表、与外部时间(例如getdate().

就效率而言,为了比较,服务器几乎可以肯定地将所有日期类型视为整数。可能对您开放的唯一速度优势,取决于您是否通常关心秒数,将集群在 上smalldatetime,因为它是 4 个字节。您仍然可以将高分辨率部分作为单独的real.

于 2013-01-10T05:33:51.567 回答
1

只要您使用datetime2type 可能就没有区别,因为两种类型的大小相似(datetime2-- 6 到 8 字节,bigint-- 8 字节)。

我假设 IO 成本将是唯一的瓶颈,因此这取决于您比较的记录数(要读取的记录)以及索引如何存储datetime2类型。

我会在你的情况下测试和比较这两个选项,并选择更好的一个,记住它datetime更容易被人类阅读。

于 2013-01-09T08:50:15.750 回答