SQL Server: Warum ist 'DBCC Page' report 'Tinyint' standardmäßig 2?

Ich habe versucht herauszufinden, wie SQL Server die Spalte Tinyint (die 1 Byte lang sein soll) speichert.

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

Hier ist das Ergebnis:

DBCC-Ausführung abgeschlossen. Wenn DBCC Fehlermeldungen ausgibt, wenden Sie sich an Ihren Systemadministrator.

SEITE: (1:182)………

Slot 0 Offset 0x60 Länge 9

Datensatztyp = PRIMARY_RECORD Datensatzattribute = NULL_BITMAP Datensatzgröße = 9

Speicherauszug @0x000000000545A060

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

Slot 0 Spalte 1 Offset 0x4 Länge 2 Länge (physisch) 2

Col1 = 3

DBCC-Ausführung abgeschlossen. Wenn DBCC Fehlermeldungen ausgibt, wenden Sie sich an Ihren Systemadministrator.

Interpretation: Die aktuelle Datenzeile ist 10 00 0600 0300 0100 00 als:
10: Statusbits A
00: Statusbit B
0600: Position, an der die Anzahl der Spalten gespeichert ist
0300: Tinyint-Daten
0100: Anzahl der Spalten
00: Null-Bitmap
Gesamtbyte: 1 + 1 + 2 + 2 + 2 + 1 = 9 bytes
Vergleich mit ‚Smallint‘:
Das Ändern des Typs ‚Col1‘ in ‚Smallint‚ (das 2 Byte lang ist) führte genau zum gleichen Ergebnis.
FrageWarum widmet SQL Server 2 Bytes der Spalte ‚Tinyint‚? Warum unterscheidet es nicht zwischen ‚Tinyint‘ und ‚Smallint‘ in der Speichergröße?

Share

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.