我已经阅读了几篇关于在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.00
到23: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 来处理大数据。