varbinary変換の長さ/データ長が6ではなく7である理由を説明できないと思います(Mikaelは後で、varbinaryへの変換によって精度が余分なバイトとして追加されることを発見しました)が、なぜそうだと思うのかわかりませんとにかく有効なテスト。実際の列を使用している場合、ページに6バイトが格納されていることを確認できます(ただし、行のnullオーバーヘッドは、列がnull可能かどうかによって異なります)。どうすればこれを証明できますか?
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;
結果:
6 7 6 7
したがって、datetime2列は6バイトですが、varbinary列は7バイトです。null可能性に関係なく。実際にページを調べることで、詳しく見ることができます。このテーブルのヒープ内のすべてのページを見つけましょう。
DBCC IND('tempdb', 'dbo.x', 0);
私のシステムでの部分的な結果(あなたのシステムは異なります):
PagePID PageType
283 10
311 1
それでは、311ページを見てみましょう。
DBCC TRACEON(3604, -1);
DBCC PAGE(2, 1, 311, 3);
そして、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