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

Come si arriva a limiti di 8060 byte per riga e 8000 per valore (varchar, nvarchar)?

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