Dentro lo Storage Engine:Anatomia di un record
Questo è per SQL Server 2005
- intestazione del record
- 4 byte di lunghezza
- due byte di metadati del record (tipo di record)
- due byte che puntano in avanti nel record alla bitmap NULL
- porzione del record a lunghezza fissa, contenente le colonne che memorizzano i tipi di dati con lunghezze fisse (ad es. bigint, char(10), datetime)
- Bitmap NULL
- due byte per il conteggio delle colonne nel record
- numero variabile di byte per memorizzare un bit per colonna nel record, indipendentemente dal fatto che la colonna sia nullable o meno (questo è diverso e più semplice di SQL Server 2000 che aveva solo un bit per colonna nullable)
- questo consente un'ottimizzazione durante la lettura di colonne NULL
- array offset colonna a lunghezza variabile
- due byte per il conteggio delle colonne a lunghezza variabile
- due byte per colonna a lunghezza variabile, fornendo l'offset alla fine del tag valueversioning della colonna
- questo è solo in SQL Server 2005 ed è una struttura a 14 byte che contiene un timestamp più un puntatore nell'archivio versioni in tempdb
Quindi, per un char(8000)
- 4 byte (intestazione del record)
- 8000 lunghezza fissa
- 3 bitmap nulli
- 2 byte per contare a lunghezza variabile
- 14 timestamp
Tuttavia, se avessi 40 colonne varchar(200)
- 4 byte (intestazione del record)
- 0 lunghezza fissa
- 6 bitmap nulli
- 2 byte per contare a lunghezza variabile
- 202 x 40 =8080
- 14 timestamp
Totale =8080 + 4 + 6 + 2 + 14 =8106. WTF? Ricevi un avviso quando hai creato questa tabella
Non mi bloccherei troppo:questa informazione ha no valore pratico quotidiano