Domanda

Comining dalla mia domanda " 8078 byte 8060 B DataPage (SQL Server)? ", dove è stato spiegato a me come derivare 8078 byte di dati per pagina in MS SQL Server.

Se a calcolare il numero di byte per pagina utilizzati per la memorizzazione di dati (senza dall'alto) di una sola riga con una colonna di tipo di record di dimensioni fisse non indicizzato (come da articolo MSDN Stima delle dimensioni di un mucchio ), poi mi vengono a 8087 byte (per pagina).

Come posso raggiungere i limiti di 8060 byte per riga (menzionato nelle risposte di mia altra questione) ed a 8000 byte per (varchar, nvarchar) senza l'acquisto e la studiano 1000 Page Books?

Sto sicuramente manca qualcosa nella allocazione dello storage: il minor numero di pezzi da gestire, tanto più in testa ...

È stato utile?

Soluzione

All'interno del motore di archiviazione: Anatomia di un record

Questo è per SQL Server 2005

  • intestazione di registrazione
    • lungo 4 byte
    • due byte di metadati di registrazione (tipo di record)
    • due byte che puntano in avanti nel record per la bitmap NULL
  • lunghezza di porzione fissa del record, contenente le colonne di stoccaggio tipi di dati che sono fisse lunghezze (ad esempio bigint, char (10), datetime)
  • bitmap NULL
    • due byte per conteggio di colonne nel record
    • numero variabile di byte per memorizzare un bit per ogni colonna nel record, indipendentemente dal fatto che la colonna è annullabile o no (questo è diverso e più semplice di SQL Server 2000 che aveva un po 'per colonna nullable solo)
    • questo permette un'ottimizzazione durante la lettura colonne che sono NULL
  • lunghezza variabile offset di colonna di matrice
    • due byte per il conteggio delle colonne di lunghezza variabile
    • due byte per colonna a lunghezza variabile, dando l'offset alla fine del valore colonna tag delle versioni
  • questo è in SQL Server solo 2005 ed è una struttura di 14 byte che contiene un timestamp più un puntatore nel negozio versione tempdb

Quindi, per un char (8000)

  • 4 byte (intestazione record)
  • 8000 di lunghezza fissa
  • 3 nullo bitmap
  • 2 byte per contare lunghezza variabile
  • 14 timestamp

Tuttavia, se si ha 40 varchar (200) colonne

  • 4 byte (intestazione record)
  • 0 lunghezza fissa
  • 6 nullo bitmap
  • 2 byte per contare lunghezza variabile
  • 202 x 40 = 8080
  • 14 timestamp

Totale = 8080 + 4 + 6 + 2 + 14 = 8106. WTF? Si ottiene un messaggio di avviso quando è stato creato questo tavolo

Non vorrei arrivare troppo appeso su di esso: queste informazioni ha non giorno pratico per valore del giorno

Altri suggerimenti

Non sono del tutto sicuro di quello che stai chiedendo, ma se la tua domanda è "perché è la lunghezza massima di 8060 byte di fila e non qualche altro numero?", Oppure "Perché NVARCHAR avere una lunghezza massima di 8000 byte? " allora la risposta breve è, chi lo sa? (E come ha detto gbn, chi se ne frega?)

Tutti i limiti MSSQL - dimensioni del tipo di dati, dimensione massima fila, colonne per tabella, colonne per indice ecc - sono solo progettare decisioni da parte di Microsoft. Sono abbastanza sicuro che ci sia una quantità enorme di documentazione tecnica dietro le decisioni, ma la maggior parte delle persone non hanno accesso a tali informazioni.

Se siete interessati a dettagli specifici quali sono i limiti, come la dimensione riga viene calcolata ecc Poi leggendo la documentazione MSSQL è il posto migliore per iniziare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top