Inside the Storage Engine:Anatomy of a record
Detta är för SQL Server 2005
- posthuvud
- 4 byte lång
- två byte av postmetadata (posttyp)
- två byte som pekar framåt i posten till NULL-bitmappen
- delen av posten med fast längd, som innehåller kolumnerna som lagrar datatyper som har fasta längder (t.ex. bigint, char(10), datetime)
- NULL bitmapp
- två byte för antalet kolumner i posten
- variabelt antal byte för att lagra en bit per kolumn i posten, oavsett om kolumnen är nullbar eller inte (detta är annorlunda och enklare än SQL Server 2000 som endast hade en bit per nullbar kolumn)
- detta tillåter en optimering vid läsning av kolumner som är NULL
- variabel längd kolumn offset array
- två byte för antalet kolumner med variabel längd
- två byte per kolumn med variabel längd, vilket ger förskjutningen till slutet av kolumnen valueversioning-taggen
- detta finns endast i SQL Server 2005 och är en 14-byte struktur som innehåller en tidsstämpel plus en pekare till versionslagret i tempdb
Så, för en char(8000)
- 4 byte (posthuvud)
- 8 000 fast längd
- 3 noll bitmapp
- 2 byte att räkna med variabel längd
- 14 tidsstämpel
Men om du hade 40 varchar(200)-kolumner
- 4 byte (posthuvud)
- 0 fast längd
- 6 noll bitmapp
- 2 byte att räkna med variabel längd
- 202 x 40 =8080
- 14 tidsstämpel
Totalt =8080 + 4 + 6 + 2 + 14 =8106. WTF? Du får en varning när du skapade den här tabellen
Jag skulle inte hänga mig för mycket på det:den här informationen har nej praktiskt dagligt värde