Condividi tramite


Gestione delle allocazioni di extent e dello spazio libero

Le strutture di dati di SQL Server che consentono di gestire le allocazioni degli extent e di tenere traccia dello spazio su disco sono organizzate in modo relativamente semplice. Tali strutture offrono i vantaggi seguenti:

  • Le informazioni relative allo spazio libero sono compresse al massimo e occupano pertanto un numero ridotto di pagine.

    Questa caratteristica comporta un aumento della velocità a causa della riduzione della quantità di letture su disco necessarie per recuperare le informazioni sull'allocazione. In questo modo, aumenta inoltre la probabilità che le pagine di allocazione vengano mantenute nella memoria e non richiedano ulteriori letture.

  • La maggior parte delle informazioni relative all'allocazione non è concatenata. Questo aspetto semplifica la gestione delle informazioni sull'allocazione.

    Ogni allocazione o deallocazione di pagina può essere eseguita in modo rapido. Questa caratteristica riduce la contesa tra attività simultanee di allocazione o deallocazione di pagine.

Gestione delle allocazioni di extent

In SQL Server vengono utilizzati due tipi di mappe per la registrazione delle allocazioni degli extent:

  • Mappa di allocazione globale (GAM, Global Allocation Map)

    Nelle pagine GAM vengono registrati gli extent allocati. In ogni pagina GAM possono essere registrati riferimenti a 64.000 extent, ovvero a circa 4 GB di dati. La pagina GAM include un bit per ogni extent dell'intervallo che la riguarda. Se il bit è 1, l'extent è disponibile, mentre se è 0, l'extent è allocato.

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

    Nelle pagine SGAM vengono registrate informazioni sugli extent misti con almeno una pagina inutilizzata. In ogni pagina SGAM possono essere registrati riferimenti a 64.000 extent, ovvero a circa 4 GB di dati. La pagina SGAM include un bit per ogni extent dell'intervallo che la riguarda. Se il bit è 1, l'extent viene utilizzato come extent misto e include una pagina disponibile. Se il bit è 0, l'extent non viene utilizzato come extent misto o rappresenta un extent misto di cui sono in uso tutte le pagine.

Nelle pagine GAM e SGAM per ogni extent sono impostati gli schemi di bit indicati di seguito, in base all'utilizzo corrente dell'extent.

Utilizzo corrente dell'extent

Impostazione del bit nella pagina GAM

Impostazione del bit nella pagina SGAM

Disponibile, non utilizzato

1

0

Extent uniforme oppure extent misto senza spazio libero

0

0

Extent misto con pagine disponibili

0

1

Ciò consente di utilizzare semplici algoritmi di gestione degli extent. Per allocare un extent uniforme, Motore di database cerca un bit 1 nella pagina GAM e lo imposta su 0. Per trovare un extent misto con pagine disponibili, Motore di database cerca un bit 1 nella pagina SGAM. Per allocare un extent misto, Motore di database cerca un bit 1 nella pagina GAM, lo imposta su 0 e quindi imposta su 1 anche il bit corrispondente nella pagina SGAM. Per deallocare un extent, Motore di database verifica che il bit nella pagina GAM sia impostato su 1 e che quello nella pagina SGAM sia impostato su 0. Gli algoritmi utilizzati internamente da Motore di database sono più complessi rispetto a quelli descritti in questo argomento, in quanto in Motore di database i dati vengono distribuiti in modo uniforme in un database. Anche gli algoritmi reali, tuttavia, risultano semplificati, in quanto non devono gestire catene di informazioni sull'allocazione degli extent.

Rilevamento dello spazio libero

Le pagine PFS (Page Free Space, Spazio libero nella pagina) consentono di rilevare lo stato di allocazione di ogni pagina, se una singola pagina sia stata allocata e la quantità di spazio libero in ogni pagina. PFS include un bit per ogni pagina, indicando se la pagina è allocata e, in tal caso, se si tratta di una pagina vuota, in uso dall'1% al 50%, dal 51% all'80%, dall'81% al 95% o dal 96% al 100%.

Dopo che un extent è stato allocato a un oggetto, Motore di database utilizza le pagine PFS per registrare le pagine dell'extent allocate e quelle disponibili. Queste informazioni vengono utilizzate quando Motore di database deve allocare una nuova pagina. La quantità di spazio libero in una pagina viene mantenuta solo per le pagine heap e text/image. Questo spazio viene utilizzato quando Motore di database deve trovare una pagina con spazio libero disponibile per includere una nuova riga inserita. Per gli indici non è necessario tenere traccia dello spazio libero nella pagina, in quanto il punto di inserimento di una nuova riga viene impostato dai valori delle chiavi di indice.

La prima pagina dopo la pagina dell'intestazione di un file di dati (con il numero di pagina 1) è una pagina PFS. Questa pagina è seguita da una pagina GAM (con il numero di pagina 2) e quindi da una pagina SGAM (pagina 3). È presente una pagina PFS circa 8.000 pagine dopo la prima. È presente un'altra pagina GAM 64.000 extent dopo la prima pagina GAM (pagina 2) e un'altra pagina SGAM 64.000 extent dopo la prima pagina SGAM (pagina 3). Nella figura seguente viene illustrata la sequenza di pagine utilizzata da Motore di database per allocare e gestire gli extent.

Pagine utilizzate per l'allocazione e la gestione degli extent