datetime2存储大小

Nic*_*ick 6 sql-server sql-server-2008 sql-server-2008-r2

使用SQL Server 2008 R2,SP2 文档datetime2需要6,7或8个字节,具体取决于您使用的精度

我需要以二进制形式存储大量数据(连接值),我喜欢每个日期时间只使用6个字节的想法,但是当我尝试:

declare @_dt_p0 datetime2(0) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p0), LEN(CONVERT(varbinary, @_dt_p0))

declare @_dt_p4 datetime2(4) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p4), LEN(CONVERT(varbinary, @_dt_p4))

declare @_dt_p7 datetime2(7) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p7), LEN(CONVERT(varbinary, @_dt_p7))
Run Code Online (Sandbox Code Playgroud)

它显然需要一个额外的字节,我做错了什么?

Aar*_*and 10

我不认为我可以解释为什么varbinary转换的长度/数据长度是7而不是6(Mikael后来发现转换为varbinary将精度添加为额外的字节),但我不知道为什么你认为这是无论如何都是有效的测试.当您使用实际列时,我可以确认页面上存储了6个字节(尽管该行的空值开销将根据列是否可为空而不同).我该如何证明这一点?

USE tempdb;
GO

CREATE TABLE dbo.x
(
 d1 DATETIME2(0)  NULL, 
 v1 VARBINARY(32) NULL,
 d2 DATETIME2(0)  NOT NULL, 
 v2 VARBINARY(32) NOT NULL
);

declare @d datetime2(0) = '2012-05-18 11:22:33';

INSERT dbo.x(d1, v1, d2, v2)
SELECT @d, CONVERT(VARBINARY(32), @d), @d, CONVERT(VARBINARY(32), @d);

SELECT DATALENGTH(d1), DATALENGTH(v1), 
       DATALENGTH(d2), DATALENGTH(v2) FROM dbo.x;
Run Code Online (Sandbox Code Playgroud)

结果:

6    7    6    7
Run Code Online (Sandbox Code Playgroud)

因此,datetime2列是6个字节,但varbinary列是7个字节.无论可空性如何.我们可以通过实际检查页面来近距离观察.让我们找到这个表的堆中的所有页面:

DBCC IND('tempdb', 'dbo.x', 0);
Run Code Online (Sandbox Code Playgroud)

我系统的部分结果(你的系统会有所不同):

PagePID  PageType
283      10
311      1
Run Code Online (Sandbox Code Playgroud)

现在让我们来看看页面311:

DBCC TRACEON(3604, -1);
DBCC PAGE(2, 1, 311, 3);
Run Code Online (Sandbox Code Playgroud)

我们可以看到datetime2列确实在页面上占用了6个字节:

Slot 0 Column 1 Offset 0x4 Length 6 Length (physical) 6

d1 = 2012-05-18 11:22:33            

v1 = [Binary data] Slot 0 Column 2 Offset 0x19 Length 7 Length (physical) 7
v1 = 0x00f99f00b0350b               

Slot 0 Column 3 Offset 0xa Length 6 Length (physical) 6

d2 = 2012-05-18 11:22:33            

v2 = [Binary data] Slot 0 Column 4 Offset 0x20 Length 7 Length (physical) 7
v2 = 0x00f99f00b0350b              
Run Code Online (Sandbox Code Playgroud)

  • @Nick - 转换为`varbinary`时,SQL Server正在为`datetime2`值添加精度.[DATETIME2值的内部存储](http://weblogs.sqlteam.com/peterl/archive/2010/12/15/the-internal-storage-of-a-datetime2-value.aspx) (2认同)