sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kommer du til grænser på 8060 bytes pr. række og 8000 pr. (varchar, nvarchar) værdi?

Inside the Storage Engine:Anatomy of a record

Dette er til SQL Server 2005

  • optagehoved
    • 4 bytes lang
    • to bytes med rekordmetadata (posttype)
    • to bytes, der peger fremad i posten til NULL bitmap
  • delen af ​​posten med fast længde, der indeholder de kolonner, der gemmer datatyper med faste længder (f.eks. bigint, char(10), datetime)
  • NULL bitmap
    • to bytes til optælling af kolonner i posten
    • variabelt antal bytes til at gemme én bit pr. kolonne i posten, uanset om kolonnen er nullbar eller ej (dette er anderledes og enklere end SQL Server 2000, som kun havde én bit pr. nullbar kolonne)
    • dette tillader en optimering ved læsning af kolonner, der er NULL
  • variabel-længde kolonne offset matrix
    • to bytes til antallet af kolonner med variabel længde
    • to bytes pr. kolonne med variabel længde, hvilket giver forskydningen til slutningen af ​​kolonneværdiversioneringskoden
  • dette er kun i SQL Server 2005 og er en 14-byte struktur, der indeholder et tidsstempel plus en peger ind i versionslagret i tempdb

Så for en char(8000)

  • 4 bytes (posthoved)
  • 8000 fast længde
  • 3 null bitmap
  • 2 bytes til at tælle variabel længde
  • 14 tidsstempel

Men hvis du havde 40 varchar(200) kolonner

  • 4 bytes (posthoved)
  • 0 fast længde
  • 6 null bitmap
  • 2 bytes til at tælle variabel længde
  • 202 x 40 =8080
  • 14 tidsstempel

I alt =8080 + 4 + 6 + 2 + 14 =8106. WTF? Du får en advarsel, når du oprettede denne tabel

Jeg ville ikke blive for hængt op i det:disse oplysninger har nej praktisk daglig værdi



  1. Sådan installeres PgBackRest

  2. hvordan man bruger xmltable i oracle?

  3. SCD Type 6

  4. Sådan installeres SQLite og SQLite Browser i Ubuntu