Gestione dello spazio utilizzato dagli oggetti

Una pagina della mappa di allocazione degli indici (IAM) esegue il mapping degli extent in una parte da 4 gigabyte (GB) di un file di database utilizzato da un'unità di allocazione. Le unità di allocazione possono essere di tre tipi:

  • IN_ROW_DATA

    Contiene una partizione di un heap o di un indice.

  • LOB_DATA

    Contiene tipi di dati LOB (Large Object), ad esempio xml, varbinary(max) e varchar(max).

  • ROW_OVERFLOW_DATA

    Contiene dati a lunghezza variabile archiviati in colonne varchar, nvarchar, varbinary o sql_variant che superano il limite della lunghezza di riga di 8.060 byte.

Ogni partizione di un heap o di un indice contiene almeno un'unità di allocazione IN_ROW_DATA. Può inoltre contenere un'unità di allocazione LOB_DATA o ROW_OVERFLOW_DATA, a seconda dello schema dell'heap o dell'indice. Per ulteriori informazioni sulle unità di allocazione, vedere Organizzazione di tabelle e indici.

Una pagina IAM include informazioni relative a un intervallo di 4 GB di un file, che corrisponde a quello di una pagina GAM o SGAM. Se l'unità di allocazione contiene extent derivati da più file o più intervalli di 4 GB di un file, saranno presenti più pagine IAM concatenate in una catena IAM. A ogni unità di allocazione corrisponde pertanto almeno una pagina IAM per ogni file in cui sono inclusi extent per l'unità di allocazione. Le pagine IAM per un file possono inoltre essere più di una se il numero di extent del file allocati all'unità di allocazione è maggiore del numero di extent che una pagina IAM è in grado di registrare.

Pagine IAM (Index Allocation Map) per la gestione degli extent

Le pagine IAM vengono allocate per ogni unità di allocazione in base alle necessità e vengono posizionate in modo casuale nel file. La vista di sistema sys.system_internals_allocation_units punta alla prima pagina IAM relativa a un'unità di allocazione e tutte le pagine IAM di tale unità di allocazione sono concatenate.

Nota importanteImportante

La vista di sistema sys.system_internals_allocation_units è solo per uso interno ed è soggetta a modifiche. Non è garantita la compatibilità.

Pagine IAM collegate in una catena per ogni unità di allocazione

Ogni pagina IAM include un'intestazione che indica l'extent iniziale dell'intervallo di extent mappati dalla pagina IAM. La pagina IAM include inoltre una mappa di bit di grandi dimensioni in cui ogni bit rappresenta un extent. Il primo bit della mappa rappresenta il primo extent dell'intervallo, il secondo bit rappresenta il secondo extent e così via. Se un bit è 0, significa che l'extent che rappresenta non è allocato all'unità di allocazione proprietaria della pagina IAM. Se il bit è 1, significa che l'extent che rappresenta è allocato all'unità di allocazione proprietaria della pagina IAM.

Se in Motore di database di SQL Server è necessario inserire una nuova riga ma lo spazio libero nella pagina non è sufficiente, vengono utilizzate le pagine IAM e PFS per trovare una pagina per l'allocazione o, nel caso di un heap o di una pagina di tipo text/image, una pagina in cui sia disponibile spazio sufficiente per la riga da inserire. Motore di database utilizza le pagine IAM per trovare gli extent allocati all'unità di allocazione. Per ogni extent, Motore di database cerca le pagine PFS per verificare se esiste una pagina da utilizzare. Poiché ogni pagina IAM e PFS include i dati di un numero di pagine elevato, il numero di pagine IAM e PFS di un database è ridotto. Ciò significa che le pagine IAM e PFS in genere risiedono nella memoria del pool di buffer di SQL Server e che pertanto è possibile eseguire rapidamente ricerche al loro interno. Per gli indici, il punto di inserimento di una nuova riga viene impostato dalla chiave dell'indice. In questo caso, il processo di ricerca illustrato in precedenza non viene eseguito.

In Motore di database viene allocato un nuovo extent a un'unità di allocazione solo se non viene trovata rapidamente una pagina di un extent esistente in cui sia disponibile spazio sufficiente per la riga da inserire. In Motore di database, gli extent da allocare vengono selezionati tra quelli disponibili nel filegroup utilizzando un algoritmo di allocazione proporzionale. Se un filegroup include due file, in uno dei quali lo spazio libero è doppio rispetto all'altro, verranno allocate due pagine del file che include la quantità di spazio libero maggiore per ogni pagina allocata dell'altro file. Ciò significa che la percentuale di spazio utilizzato deve essere analoga in tutti i file di un filegroup.