我有一堆表格,它们在不同的级别上汇总数据:季度、小时、日和月。除此之外还有一个包含“原始”数据的基础表格,它包含一些额外的列。所有汇总表格都具有相同的列。
基础、季度和小时表格使用smalldatetime
类型的列来对数据进行时间戳。这个列也会出现在小时和日表格中,但当然我在这里不需要时间方面的信息。
为了简单起见,我想在这里也使用smalldatetime数据类型,但是也许对于性能来说使用日期数据类型更好?
在性能方面,这两种类型之间是否存在真正的差异?
我有一堆表格,它们在不同的级别上汇总数据:季度、小时、日和月。除此之外还有一个包含“原始”数据的基础表格,它包含一些额外的列。所有汇总表格都具有相同的列。
基础、季度和小时表格使用smalldatetime
类型的列来对数据进行时间戳。这个列也会出现在小时和日表格中,但当然我在这里不需要时间方面的信息。
为了简单起见,我想在这里也使用smalldatetime数据类型,但是也许对于性能来说使用日期数据类型更好?
在性能方面,这两种类型之间是否存在真正的差异?
通常使用尽可能小的数据类型是个好主意。你不应该使用varchar(max)甚至是varchar(10)来存储一个2个字符长度的州缩写。
同样地,如果你只需要日期(比如4/11/2001),那么使用Date类型而不是DateTime类型。
虽然在性能上它可能没有太大的改善(DateTime比Date多5个字节),但如果你有多个字段和/或多行记录,这些改进可以开始累积。
不同的数据类型具有不同的size,这会影响数据/索引的大小,这比查询性能(I/O成本)更重要。
另一方面,数据类型之间的转换可能会很昂贵。此外,各种数据类型之间的隐式转换可能是错误/意外的。
如果您在日期列上的表之间进行JOIN操作,或者如果不保留最小可能的日期类型,则应保留一个日期类型(在此示例中为4字节的smalldatetime
),以存储小时和季度,以及date
用于纯日期。
范围
SmallDateTime:1900年1月1日至2079年6月6日 DateTime:1753年1月1日至9999年12月31日
精度
SmallDateTime:分钟 DateTime:三百分之一秒(3.33)
存储
SmallDateTime:4字节 DateTime:8字节
也请检查以下内容:
当您需要将varchar(max)转换为datetime时:
declare @s varchar(max)
set @s = '2018-06-01 00:00:01'
select CONVERT(smalldatetime, @s )
select CONVERT(datetime,@s )
结果是这样的
2018-06-01 00:00:00
2018-06-01 00:00:01.000
当转换为smalldatetime时,午夜过后的这一秒就消失了。
不幸的是,在使用 bcp(批量复制)实用程序进行导出/导入操作时,smalldatetime
对我造成了麻烦。BCP 导入似乎不喜欢 smalldatetime
字段(至少在它们被 BCP 导出时)。即使在 SQL Server 2008 版本中并使用 bcp 中的“本地”格式也是如此。因此,将来我会使用 datetime
进行我的工作,因为我喜欢能够使用 bcp 来移动数据。