sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kommer du till gränser på 8060 byte per rad och 8000 per (varchar, nvarchar) värde?

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



  1. Explicita JOINs vs implicita joins?

  2. Rails Migration byter kolumn för att använda Postgres-matriser

  3. 4 Fantastiska SQL Server-övervakningsresurser för databasadministratörer

  4. Hämta datatyp av fält i select-satsen i ORACLE