2

TinyintSQL Server が(1 バイト長であると想定されている) 列をどのように格納するかを理解しようとしました。

-- Create table
CREATE TABLE MyTest.dbo.TempTable
(
    Col1 Tinyint NOT NULL
);

-- Fill it up
INSERT INTO dbo.TempTable VALUES (3);

-- Get page info
dbcc ind
(
'MyTest'                 /*Database Name*/
,'dbo.TempTable' /*Table Name*/
,-1 /*Display information for all pages of all indenxes*/
);

-- Get page data
dbcc traceon(3604)
dbcc page
(
'MyTest' /*Database Name*/
,1      /*File ID*/
,182 /*Page ID*/
,3     /*Output mode: 3 - display page header and row details */
) 

結果は次のとおりです。


DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に連絡してください。

ページ: (1:182) ... ... ...

スロット 0 オフセット 0x60長さ 9

レコード タイプ = PRIMARY_RECORD レコード属性 = NULL_BITMAPレコード サイズ = 9

メモリダンプ @0x000000000545A060

0000000000000000: 10000600 03000100 00 ††††††††††††††††††…………

スロット 0 列 1 オフセット 0x4 長さ 2 長さ (物理) 2

列 1 = 3

DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に連絡してください。


解釈: 実際のデータ行は 10 00 0600 0300 0100 00 です:
10: ステータス ビット A
00: ステータス ビット B
0600: 列数が格納される位置
0300: Tinyint データ
0100: 列数
00: Null ビットマップ
総バイト数: 1 + 1 + 2 + 2 + 2 + 1 = 9 バイト

'Smallint' との比較:
'Col1' 型を ' Smallint' (2 バイト長)に変更すると、まったく同じ結果が得られました。

質問TinyintSQL Server が ' ' 列 に 2 バイトを割り当てるのはなぜですか? ストア サイズで「Tinyint」と「Smallint」を区別しないのはなぜですか?

4

1 に答える 1

1

DBCC PAGE WITH TABLERESULTS の出力を確認してください。

すべて 0 の行とすべて 1 の行の 2 つの行を入力すると、tinyint フィールドが 1 バイトしか使用していないことがはっきりとわかります。

CREATE TABLE dbo.SpaceTest
    (
      biggest BIGINT ,
      medium INT ,
      small SMALLINT ,
      tiny TINYINT
    )
INSERT  INTO dbo.SpaceTest
        ( biggest, medium, small, tiny )
VALUES  ( 0, 0, 0, 0 ),
        ( 1, 1, 1, 1 )

--Get a list of pages used by the table
DBCC IND('Sandbox', 'SpaceTest',0)

DBCC IND の出力

DBCC TRACEON (3604);
DBCC PAGE (Sandbox,1,42823,3) WITH tableresults;
GO

ここに画像の説明を入力

于 2015-04-07T20:36:01.410 に答える