SQL Server: Perché' DBCC Page ' report ' Tinyint ' è 2 byetes?

Ho provato a capire come SQL Server memorizza la colonna Tinyint (che dovrebbe essere lunga 1 byte).

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

Ecco il risultato:

Esecuzione DBCC completata. Se DBCC stampato messaggi di errore, contattare l’amministratore di sistema.

PAGINA: (1:182)………

Slot 0 Offset 0x60 Lunghezza 9

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

Memory Dump @0x000000000545A060

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

Fessura 0 Colonna 1 Offset 0x4 Lunghezza 2 Lunghezza (fisico) 2

Col1 = 3

Esecuzione DBCC completata. Se DBCC stampato messaggi di errore, contattare l’amministratore di sistema.

Interpretazione: La riga dei dati effettivi è 10 00 0600 0300 0100 00 as:
10: Bit di stato A
00: Bit di stato B
0600: Posizione in cui è memorizzato il numero di colonne
0300: Dati Tinyint
0100: Numero di colonne
00: bitmap null
Byte totali: 1 + 1 + 2 + 2 + 2 + 1 = 9 byte
Rispetto a ‘Smallint’:
L’alterazione del tipo ‘Col1’ a ‘Smallint ‘ (che è lungo 2 byte) ha prodotto esattamente lo stesso risultato.
domandaperché SQL Server dedica 2 byte alla colonna ‘Tinyint‘? Perché non distingue tra “Tinyint” e “Smallint” nelle dimensioni del negozio?

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.