SQL Server: varför'DBCC sida ' rapport 'Tinyint' är 2 byetes?

jag försökte räkna ut hur SQL Server lagrar Tinyint (som ska vara 1-byte lång) kolumn.

-- Create tableCREATE TABLE MyTest.dbo.TempTable( Col1 Tinyint NOT NULL);-- Fill it upINSERT INTO dbo.TempTable VALUES (3);-- Get page infodbcc ind('MyTest' /*Database Name*/,'dbo.TempTable' /*Table Name*/,-1 /*Display information for all pages of all indenxes*/);-- Get page datadbcc traceon(3604)dbcc page('MyTest' /*Database Name*/,1 /*File ID*/,182 /*Page ID*/,3 /*Output mode: 3 - display page header and row details */) 

här är resultatet:

DBCC-körning slutförd. Om DBCC utskrivna felmeddelanden, kontakta systemadministratören.

sida: (1: 182)………

Slot 0 Offset 0x60 Längd 9

Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 9

minnesdump @0x000000000545A060

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

spår 0 kolonn 1 Offset 0x4 längd 2 Längd (fysisk) 2

Col1 = 3

DBCC utförande avslutad. Om DBCC utskrivna felmeddelanden, kontakta systemadministratören.

Tolkning: den faktiska dataraden är 10 00 0600 0300 0100 00 som:
10: statusbitar a
00: Status bit B
0600: Position där antalet kolumner lagras
0300: Tinyint data
0100: antal kolumn
00: Null bitmapp
totalt byte: 1 + 1 + 2 + 2 + 2 + 1 = 9 byte
jämföra med ’Smallint’:
ändra’ Col1 ’typ till’ Smallint ’ (som är 2-byte lång) gav exakt samma resultat.
Frågavarför ägnar SQL Server 2 byte till’ Tinyint ’ kolumn? Varför skiljer det inte mellan ’Tinyint’ och ’Smallint’ i butiksstorlek?

Share

Lämna ett svar

Din e-postadress kommer inte publiceras.