Informazioni su pagine ed extent

L'unità di base per l'archiviazione dei dati in SQL Server è la pagina. Lo spazio su disco allocato in un file di dati (con estensione mdf o ndf) di un database viene suddiviso logicamente in pagine numerate in modo sequenziale da 0 a n. Le operazioni di I/O su disco vengono eseguite al livello della pagina. Questo significa che SQL Server legge o scrive pagine di dati intere.

Gli extent sono un gruppo di otto pagine fisicamente contigue e vengono utilizzati per gestire in maniera efficiente le pagine. Tutte le pagine sono archiviate in extent.

Pagine

In SQL Server la dimensione di una pagina è 8 KB. I database di SQL Server includono pertanto 128 pagine per megabyte. Ogni pagina inizia con un'intestazione di 96 byte utilizzata per archiviare informazioni di sistema relative alla pagina. Queste informazioni includono il numero della pagina, il tipo di pagina, la quantità di spazio disponibile nella pagina e l'ID dell'unità di allocazione dell'oggetto proprietario della pagina.

Nella tabella seguente vengono elencati i tipi di pagina utilizzati nei file di dati di un database SQL Server.

Tipo di pagina

Contenuto

Data

Righe di dati contenenti tutti i tipi di dati, a eccezione dei dati text, ntext, image, nvarchar(max), varchar(max), varbinary(max) e xml quando text in row è impostato su ON.

Indice

Voci di indice.

Text/Image

Tipi di dati per oggetti di grandi dimensioni:

  • dati text, ntext, image, nvarchar(max), varchar(max), varbinary(max) e xml

Colonne a lunghezza variabile quando la riga di dati supera gli 8 KB:

  • varchar, nvarchar, varbinary e sql_variant

Mappa di allocazione globale (GAM, Global Allocation Map), Mappa di allocazione globale condivisa (SGAM, Shared Global Allocation Map)

Informazioni che indicano se gli extent sono allocati.

Spazio libero nella pagina (PFS, Page Free Space)

Informazioni sull'allocazione delle pagine e sullo spazio disponibile nelle pagine.

Mappa di allocazione degli indici (IAM, Index Allocation Map)

Informazioni sugli extent utilizzati da una tabella o da un indice per unità di allocazione.

Mappa delle modifiche di copia bulk (BCM, Bulk Changed Map)

Informazioni sugli extent modificati da operazioni bulk eseguite dopo l'ultima istruzione BACKUP LOG per unità di allocazione.

Mappa differenziale delle modifiche (DCM, Differential Changed Map)

Informazioni sugli extent modificati dopo l'esecuzione dell'ultima istruzione BACKUP DATABASE.

Nota

I file di log non includono pagine, ma solo una serie di record di log.

Le righe di dati vengono inserite in sequenza nella pagina iniziando immediatamente dopo l'intestazione. Una tabella dell'offset delle righe inizia alla fine della pagina. Ogni tabella dell'offset delle righe include una voce per ogni riga della pagina e in ogni voce viene registrata la distanza del primo byte della riga dall'inizio della pagina. Le voci della tabella dell'offset delle righe sono in sequenza inversa rispetto a quella delle righe della pagina.

Pagina di dati di SQL Server con offset di riga

Supporto per righe di grandi dimensioni

Le righe non possono estendersi su più pagine. È tuttavia possibile che parti di una riga vengano spostate all'esterno della pagina della riga in modo che questa possa di fatto essere di grandi dimensioni. La quantità massima di dati e overhead contenuti in una singola riga di una pagina è 8.060 byte (8 KB). Questa limitazione non include tuttavia i dati archiviati nel tipo di pagina Text/Image. Questa limitazione non è assoluta per le tabelle che contengono colonne di tipo varchar, nvarchar, varbinary o sql_variant. Quando la dimensione totale delle righe di tutte le colonne a lunghezza fissa e variabile di una tabella supera il limite di 8.060 byte, SQL Server sposta dinamicamente una o più colonne a lunghezza variabile all'interno di pagine nell'unità di allocazione ROW_OVERFLOW_DATA, iniziando dalla colonna con la larghezza maggiore. Questa operazione viene eseguita ogni volta che un aggiornamento o un inserimento aumenta la dimensione totale della riga fino a superare il limite di 8.060 byte. Quando una colonna viene spostata in una pagina nell'unità di allocazione ROW_OVERFLOW_DATA, viene mantenuto un puntatore di 24 byte sulla pagina originale nell'unità di allocazione IN_ROW_DATA. Se un'operazione successiva riduce la dimensione della riga, SQL Server sposta nuovamente le colonne nella pagina di dati originale in maniera dinamica. Per ulteriori informazioni, vedere Dati di overflow della riga che superano 8 KB.

Extent

L'extent è l'unità di base in cui viene gestito lo spazio. Un extent è costituito da otto pagine fisicamente contigue, ovvero da 64 KB. I database di SQL Server includono pertanto 16 extent per megabyte.

Per allocare lo spazio con la massima efficienza, in SQL Server non vengono allocati interi extent in tabelle che includono quantità di dati ridotte. SQL Server include due tipi di extent:

  • Gli extent uniformi sono di proprietà di un unico oggetto, pertanto le otto pagine dell'extent possono essere utilizzate solo da tale oggetto.

  • Gli extent misti possono essere condivisi al massimo da otto oggetti. Ognuna delle otto pagine dell'extent può essere di proprietà di un oggetto differente.

In una nuova tabella o nuovo indice vengono generalmente allocate pagine da extent misti. Se la tabella o l'indice aumenta di dimensioni fino a includere otto pagine, per le allocazioni successive a esso dirette vengono utilizzati extent uniformi. Se si crea un indice per una tabella esistente che contiene un numero di righe sufficiente per generare otto pagine nell'indice, tutte le allocazioni per l'indice appartengono a extent uniformi.

Extent misti e uniformi