SQL Server: Hvorfor' DBCC Side 'rapport' Tinyint ' er 2 byetes?

jeg prøvde å finne ut hvordan SQL Server lagrer Tinyint(som skal være 1-byte lang) kolonne.

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

her er resultatet:

dbcc-utførelse fullført. Hvis DBCC trykte feilmeldinger, kontakt systemadministratoren.

SIDE: (1:182)………

Slot 0 Offset 0x60 Lengde 9

Posttype = PRIMARY_RECORD Postattributter = NULL_BITMAP Poststørrelse = 9

Minnedump @0x000000000545A060

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

Slot 0 Kolonne 1 Offset 0x4 Lengde 2 Lengde (fysisk) 2

Col1 = 3

dbcc-kjøring fullført. Hvis DBCC trykte feilmeldinger, kontakt systemadministratoren.

Tolkning: den faktiske dataraden er 10 00 0600 0300 0100 00 som:
10: Statusbiter A
00: Statusbit B
0600: Posisjon der antall kolonner er lagret
0300: Tinyint data
0100: antall kolonner
00: Null bitmap
Totalt antall byte: 1 + 1 + 2 + 2 + 2 + 1 = 9 byte
Sammenligning med ‘Smallint’:
Endre ‘Col1’ type til ‘Smallint ‘ (som er 2-byte lang) ga nøyaktig samme resultat.
Spørsmålhvorfor dedikerer SQL Server 2 byte til kolonnenTinyint? Hvorfor skiller Det ikke mellom ‘Tinyint ‘ og’ Smallint ‘ i butikkstørrelse?

Share

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.