6

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))

それは明らかに1バイト余分に取っています、私が間違っているのは何ですか?

4

2 に答える 2

10

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              
于 2012-08-21T19:20:41.570 に答える
1

良い一日、

まず、これが最良の質問だと言いたいのですが、「とにかくそれが有効なテストだと思う理由がわかりません」。答えは、これは有効なテストではないということです。

DateTime2の実際の保存形式の説明を含め、この問題に関するすべてを読むことができます。また、「バイナリへの変換」の結果を調べて、これが実際の保存データと同じであると想定するのがなぜ間違っているのかを確認できます。varcharやnvarcharのような可変長データでは正確ではなく、DateTime2でも正確ではありません。実際に保存された形式を調べて取得する唯一の方法は、DBCCPAGEを使用してデータ自体を調べることです。 http://ariely.info/Blog/tabid/83/EntryId/162/Examine-how-DateTime2-type-stored-in-the-data-file.aspx

これがお役に立てば幸いです:-)

于 2015-05-10T08:46:22.990 に答える