我有几个表必须根据开始和结束日期加入,例如......
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]
这些表可能在数百万行中。
我可以选择将start / stop存储为datetime2和/或bigint(自纪元以来的纳秒)。鉴于此选项 - 如果使用bigint,那么是否可以获得性能提升?
任何一种方法都有利弊吗?
我希望整数方法更快 -
答案 0 :(得分:4)
使用datetime2
。除了“人类更容易阅读”之外,更容易人类编程。如果您不使用日期类型来表示日期,那么您将遇到计算间隔,加入其他表格,与外部时间进行比较等问题,例如: getdate()
。
就效率而言,为了进行比较,服务器几乎肯定会将所有日期类型视为整数。根据您是否经常关注秒数,可能对您开放的唯一速度优势是smalldatetime
上的群集,因为它是4个字节。您仍然可以将高分辨率部分保持为单独的real
。
答案 1 :(得分:1)
只要您使用datetime2
类型可能没有区别,因为两种类型的大小相似(datetime2
- 6到8个字节,bigint
- 8个字节)。
我认为IO成本将是唯一的瓶颈,因此它取决于您比较的记录数(要读取的记录)以及索引将如何存储datetime2
类型。
我会测试&amp;比较你的情况下的两个选项,并选择更好的选项,记住datetime
更容易被人阅读。