SQL Server smalldatetime vs datetime2



我已经阅读了几篇关于在SQL Server中使用支持日期的数据类型的文章,但我仍然不确定使用哪种数据。

所有人都说使用新的强大的datetime2类型,但smalldatetime内存方面仍然更方便(6 字节与 4 字节)

这是我的范围:

以这种方式定义的表:

Date: typeof(<Date type to choose>)
Value1: typeof(int)
Value2: typeof(int)
Value3: typeof(int)

然后我有这些要求:

对于Date列,我需要精确到分钟。

在此表中,我每天将存储多达100 万条记录,因此大数据很大。

我的问题是:我是否必须使用每天节省 2 MB 的旧smalldatetype

我应该使用新的强大的datetime2数据类型吗?

谢谢

datetime2(2)是 6 个字节,不仅可以让您获得几秒钟,而且最多可以获得 2 位毫秒(00:00:00.0023:59:59.99)。

smalldatetime是 4 个字节,并且有可能每行节省 2 个字节,如果此列是聚类分析键的一部分,则保存的这 2 个字节将对每个非聚集索引产生影响。

smalldatetime的一个重要特征是它舍入到最接近的分钟,而不是截断秒。根据将数据插入表的方式以及是否需要此行为,在将此值插入表中之前,可能需要对此值进行额外的预处理。

例:

create table t (sdt smalldatetime, dt2 datetime2(2))
insert into t values 
('2017-01-01T11:22:22.33','2017-01-01T11:22:22.33')
,('2017-01-01T11:22:33.33','2017-01-01T11:22:33.33')
select 
sdt = convert(char(23),sdt,121)
, dt2 = convert(char(23),dt2,121) 
from t

Rextester 演示:http://rextester.com/JPMEE57778

返回:

+-------------------------+-------------------------+
|           sdt           |           dt2           |
+-------------------------+-------------------------+
| 2017-01-01 11:22:00.000 | 2017-01-01 11:22:22.33  |
| 2017-01-01 11:23:00.000 | 2017-01-01 11:22:33.33  |
+-------------------------+-------------------------+

我真的很不喜欢这种四舍五入,所以这可能足以让我使用datetime2(2)尽管每天节省 2mb,除非它是集群键的一部分。

参考:

  • smalldatetime
  • datetime2
  • 磁盘空间很便宜 -这不是重点! - 金伯利·特里普
  • 不断增加的聚类关键 – 聚簇索引辩论.........再次! - 金伯利·特里普
  • 聚簇指数的争论仍在继续... - 金伯利·特里普

日期范围:小日期时间:1900-01-01 到 2079-06-06 和日期时间 2:0001-01-01 到 9999-12-31

存储:如果你不需要几秒钟,只需要几小时和几分钟,那么存储就像 4 字节的 smalldatetime,而不是 6 字节的 datetime2(0)。

datetime2 是值范围、精度(无舍入!)的升级,因此您应该使用 DateTime2 来处理大数据。

最新更新