Compattazione di un database

È possibile ridurre le dimensioni di tutti i file contenuti in un database rimuovendo le pagine inutilizzate. Motore di database è in grado di riutilizzare lo spazio in modo efficiente, tuttavia a volte non è necessario mantenere le dimensioni precedenti di un file e in questi casi può diventare necessario compattarlo. È possibile compattare i file di dati e i file di log delle transazioni. I file di database possono essere compattati manualmente, sia in gruppo che come singoli file, oppure è possibile impostare la compattazione automatica del database a intervalli specifici.

I file vengono compattati sempre a partire dalla fine. Se, ad esempio, si dispone di un file di 5 GB e si specifica 4 GB per il parametro target_size di un'istruzione DBCC SHRINKFILE, Motore di database libererà la maggiore quantità di spazio possibile nell'ultimo gigabyte del file. Se nella parte del file in cui viene liberato spazio sono presenti pagine utilizzate, Motore di database trasferisce innanzitutto queste pagine nella parte del file che rimarrà invariata. È possibile compattare un database solo finché non include più spazio libero. Se, ad esempio, in un database di 5 GB sono inclusi 4 GB di dati e si specifica 3 GB per il parametro target_size dell'istruzione DBCC SHRINKFILE, verrà liberato un solo gigabyte.

Compattazione automatica del database

Se l'opzione di database AUTO_SHRINK è impostata su ON, Motore di database compatta automaticamente i database nei quali è presente spazio libero. Per impostare questa opzione è possibile utilizzare l'istruzione ALTER DATABASE. Per impostazione predefinita, l'opzione è impostata su OFF. Motore di database verifica periodicamente l'utilizzo dello spazio in ogni database. Se l'opzione AUTO_SHRINK di un database è impostata su ON, Motore di database riduce le dimensioni dei file del database. Questa attività viene eseguita in background e non ha effetto sulle attività svolte dagli utenti nel database.

Per impostare la compattazione automatica del database

ALTER DATABASE (Transact-SQL)

Compattazione manuale del database

Per compattare manualmente un database o i file contenuti in un database, è possibile utilizzare l'istruzione DBCC SHRINKDATABASE o DBCC SHRINKFILE. Se l'istruzione non riesce a liberare tutto lo spazio specificato di un file di log, viene visualizzato un messaggio informativo che indica l'azione necessaria per liberare altro spazio. Per ulteriori informazioni sulla compattazione dei file di log, vedere Compattazione del log delle transazioni.

È possibile interrompere le istruzioni DBCC SHRINKDATABASE e DBCC SHRINKFILE in qualsiasi momento, senza perdere il lavoro completato.

Se si utilizza l'istruzione DBCC SHRINKDATABASE, non è possibile compattare un intero database in modo che raggiunga dimensioni inferiori a quelle originali. Pertanto, se è stato creato un database con dimensioni pari a 10 MB e le dimensioni sono aumentate fino a 100 MB, è possibile compattare il database fino a un minimo di 10 MB, anche se tutti i dati nel database sono stati eliminati.

È tuttavia possibile compattare i singoli file di database in modo che raggiungano dimensioni inferiori a quelle iniziali utilizzando l'istruzione DBCC SHRINKFILE. È necessario compattare ogni singolo file, anziché l'intero database.

Nota

Non è possibile compattare il database o il log delle transazioni mentre ne viene eseguito il backup e non è possibile creare un backup del database o di un log delle transazioni mentre si sta tentando di compattarlo.

Per compattare un database

Per compattare un file di dati o di log

Compattazione del log delle transazioni

Esistono limiti fissi entro i quali è possibile compattare un file di log delle transazioni. Le dimensioni dei file di log virtuali determinano la possibile riduzione delle dimensioni. Il file di log non può essere pertanto compattato in modo che raggiunga dimensioni inferiori a quelle del file di log virtuale. Inoltre, il file di log viene ridotto a incrementi corrispondenti alle dimensioni del file di log virtuale. Ad esempio, un file di log delle transazioni con dimensioni iniziali pari a 1 GB può includere cinque file di log virtuali, ognuno di 200 MB. La compattazione del file di log delle transazioni consente di eliminare i file di log virtuali inutilizzati, anche se rimangono disponibili almeno due file di log virtuali. Poiché ogni file di log virtuale nell'esempio descritto è di 200 MB, il log delle transazioni può essere compattato solo fino a un minimo di 400 MB e con incrementi di 200 MB. Per poter ridurre le dimensioni di un file di log delle transazioni, è consigliabile creare un log delle transazioni di dimensioni contenute e lasciarlo aumentare automaticamente anziché creare un file di log delle transazioni di grandi dimensioni.

Un'operazione DBCC SHRINKDATABASE o DBCC SHRINKFILE tenta di compattare immediatamente il file di log delle transazioni fino a ottenere le dimensioni richieste (con eventuale arrotondamento). È consigliabile eseguire il backup del file di log prima di compattarlo, in modo da ridurre le dimensioni del log logico e contrassegnare come inattivi i log virtuali che non contengono parti del log logico. Per ulteriori informazioni, vedere Compattazione del log delle transazioni.

Procedure consigliate

Quando si pianifica la compattazione di un database o di un file, considerare le informazioni seguenti:

  • Un'operazione di compattazione è più efficace dopo l'esecuzione di un'operazione che crea una quantità elevata di spazio inutilizzato, ad esempio il troncamento o l'eliminazione di una tabella.

  • La maggior parte dei database richiede la disponibilità di spazio per lo svolgimento delle normali attività quotidiane. Se si compatta ripetutamente un database ma le sue dimensioni aumentano di nuovo, significa che lo spazio compattato è necessario per le normali operazioni. In questi casi è inutile compattare ripetutamente il database.

  • L'operazione di compattazione generalmente aumenta la frammentazione degli indici del database. Non è consigliabile, ad esempio, compattare un database o un file di dati dopo la ricostruzione di indici. Questo è un ulteriore motivo per evitare di compattare ripetutamente un database.

  • A meno che non sia presente un requisito specifico, non impostare l'opzione di database AUTO_SHRINK su ON.

Livelli di isolamento basati sul controllo delle versioni delle righe e operazioni di compattazione

È possibile che le operazioni di compattazione vengano bloccate da una transazione in esecuzione con un livello di isolamento basato sul controllo delle versioni delle righe. Se, ad esempio, viene eseguita un'operazione DBCC SHRINK DATABASE mentre è in corso un'operazione di eliminazione di grandi dimensioni che utilizza un livello di isolamento basato sul controllo delle versioni delle righe, l'operazione di compattazione dei file viene rimandata fino al completamento dell'operazione di eliminazione. In tal caso viene registrato un messaggio informativo (il messaggio 5202 per SHRINKDATABASE e il messaggio 5203 per SHRINKFILE) nel log degli errori di SQL Server ogni cinque minuti nella prima ora e quindi ogni ora. Per ulteriori informazioni, vedere DBCC SHRINKDATABASE (Transact-SQL).