我有一堆表来整合不同级别的数据:季度,小时,每日和每月。除此之外,还有一个包含“原始”数据的基表,这个数据包含一些额外的列。统一表格都具有相同的列。
base,quarter和hourly表使用类型smalldatetime
的列来为数据加时间戳。此列也将在每小时和每日表格中提供,但当然我不需要时间方面。
为了简单起见,我也希望在这里使用smalldatetime数据类型,但是对于列的日期数据类型,性能可能更好吗?
在性能方面,这些类型之间是否存在很大差异?
答案 0 :(得分:14)
使用您需要的最小数据类型通常是个好主意。您不应该使用varchar(max)或甚至varchar(10)来存储2个字符的州名缩写。
从同样的意义上说,如果您只需要日期(例如4/11/2001),那么请使用日期类型而不是日期时间类型。
虽然它可能不是一个巨大的性能提升(DateTime比Date大5个字节。)如果你有多个字段和/或多行,它可以开始加起来。
答案 1 :(得分:4)
各种数据类型具有各种size 影响数据/索引的大小,这比查询性能(I / O成本)更重要。
另一方面,数据类型之间的转换可能成本很高。此外,各种数据类型之间的隐式转换可能是错误/意外的。
如果你在日期列的表之间加入,或者如果不保持最小的日期类型 - smalldatetime
用于存储小时数,我将保留一种类型的日期(在这种情况下为4个字节smalldatetime
)季度和date
纯日期。
答案 2 :(得分:0)
不幸的是,在smalldatetime
的情况下,当我使用bcp(批量复制)实用程序进行导出/导入操作时,它会给我带来麻烦。 BCP导入似乎与smalldatetime
字段不同(至少在BCP导出时)。版本晚于SQL Server 2008并在bcp中使用“本机”格式。因此,我将来会使用datetime
作为我的工作,因为我希望能够使用bcp来移动数据。
答案 3 :(得分:0)
范围
SmallDateTime:1 - 1月 - 1900年至6月6日 - 2079年 日期时间:1 - jan -1753至31 - Dec - 9999
精确度
SmallDateTime:分钟 日期时间:百分之三秒(3.33)
存储
SmallDateTime:4个字节 日期时间:8个字节
答案 4 :(得分:0)
检查一下:
当你必须从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时消失了