DBCC SHRINKDATABASE (Transact-SQL)

Data aggiornamento: 14 aprile 2006

Compatta le dimensioni dei file di dati o di log nel database specificato.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

DBCC SHRINKDATABASE 
( database_name | database_id | 0 
     [ ,target_percent ] 
     [ , { NOTRUNCATE | TRUNCATEONLY } ] 
)
[ WITH NO_INFOMSGS ]

Argomenti

  • database_name | database_id | 0
    Nome o ID del database che si desidera compattare. Se si specifica 0, viene utilizzato il database corrente.
  • target_percent
    Percentuale di spazio che si desidera rendere disponibile nel file del database dopo la compattazione.
  • NOTRUNCATE
    Compatta i dati nei file di dati spostando le pagine allocate dalla fine di un file a pagine non allocate all'inizio del file. target_percent è facoltativo.

    Lo spazio disponibile alla fine del file non viene restituito al sistema operativo e le dimensioni fisiche del file rimangono invariate. Pertanto, quando si specifica NOTRUNCATE, sembra che il database non venga compattato.

    NOTRUNCATE è applicabile solo ai file di dati. I file di log non sono interessati.

  • TRUNCATEONLY
    Rilascia tutto lo spazio disponibile alla fine del file al sistema operativo senza eseguire alcuno spostamento di pagine all'interno del file. Il file di dati viene compattato solo fino all'ultimo extent allocato. Se è specificata l'opzione TRUNCATEONLY, target_percent viene ignorato.

    TRUNCATEONLY è applicabile solo ai file di dati. I file di log non sono interessati.

  • WITH NO_INFOMSGS
    Evita la visualizzazione di tutti i messaggi informativi con livello di gravità compreso tra 0 e 10.

Set di risultati

Nella tabella seguente vengono descritte le colonne del set di risultati.

Nome colonna Descrizione

DbId

Numero di identificazione del database del file che il Motore di database tenta di compattare.

FileId

Numero di identificazione del file che il Motore di database tenta di compattare.

CurrentSize

Numero di pagine da 8 KB attualmente occupate dal file.

MinimumSize

Numero minimo di pagine da 8 KB che il file può occupare. Corrisponde alle dimensioni minime o alle dimensioni originali di un file.

UsedPages

Numero di pagine da 8 KB utilizzate dal file.

EstimatedPages

Numero di pagine da 8 KB calcolato dal Motore di database. Corrisponde alle possibili dimensioni finali del file compattato.

[!NOTA]    Il Motore di database non visualizza alcuna riga per i file non compattati.

Osservazioni

Per compattare tutti i file di dati e di log per un database specifico, eseguire il comando DBCC SHRINKDATABASE. Per compattare un file di dati o di log alla volta per un database specifico, eseguire il comando DBCC SHRINKFILE.

Per visualizzare la quantità corrente di spazio disponibile, ovvero non allocato, nel database, eseguire sp_spaceused.

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

Non è possibile ridurre il database a dimensioni inferiori a quelle minime. Le dimensioni minime corrispondono a quelle specificate al momento della creazione del database o alle ultime dimensioni impostate in modo esplicito tramite un'operazione di modifica delle dimensioni dei file, ad esempio DBCC SHIRNKFILE o ALTER DATABASE. Ad esempio, 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.

Eseguire DBCC SHRINKDATABASE senza specificare l'opzione NOTRUNCATE o TRUNCATEONLY equivale a eseguire un'operazione DBCC SHRINKDATABASE con NOTRUNCATE seguita da un'operazione DBCC SHRINKDATABASE con TRUNCATEONLY.

Il database in fase di compattazione non deve essere in modalità utente singolo. Altri utenti possono infatti utilizzare il database durante il processo di compattazione. Questo vale anche per i database di sistema.

Non è possibile compattare un database mentre ne viene eseguito il backup e non è possibile eseguire il backup di un database mentre è in corso un'operazione di compattazione.

Funzionamento di DBCC SHRINKDATABASE

DBCC SHRINKDATABASE compatta i file di dati uno alla volta mentre i file di log vengono compattati come se fossero inclusi in un pool di log contigui. I file vengono compattati sempre a partire dalla fine.

Si supponga che sia disponibile il database mydb con un file di dati e due file di log, ognuno dei quali ha dimensioni pari a 10 MB, e che il file di dati contenga 6 MB di dati.

Per ogni file il Motore di database di SQL Server 2005 Microsoft calcola le dimensioni di destinazione in base alle quali il file deve essere compattato. Se per DBCC SHRINKDATABASE viene specificato target_percent, il Motore di database calcola le dimensioni di destinazione in modo che dopo la compattazione corrispondano alla percentuale di spazio disponibile specificata in target_percent. Ad esempio, se per target_percent si specifica il valore 25 per la compattazione di mydb, il Motore di database calcola le dimensioni di destinazione del file di dati in 8 MB, ovvero 6 MB di dati e 2 MB di spazio disponibile. Pertanto, i dati vengono spostati dagli ultimi 2 MB del file di dati nello spazio disponibile della prima parte da 8 MB del file di dati e il file viene quindi compattato.

Si supponga che il file di dati di mydb contenga 7 MB di dati. Se per target_percent si specifica il valore 30, il file di dati verrà compattato del 30%. Se tuttavia per target_percent si specifica il valore 40, il file di dati non verrà compattato poiché il Motore di database non esegue la compattazione di file se le dimensioni di destinazione sono inferiori allo spazio occupato originariamente dai dati. È inoltre possibile descrivere questo concetto in modo diverso, ovvero che il 40% di spazio disponibile + il 70% del file di dati completo (7 dei 10 MB) è maggiore del 100%. Dato che la somma della percentuale di spazio disponibile desiderata e della percentuale di spazio occupata dal file di dati è maggiore del 100% (del 10%), con valori di target_size maggiori di 30 la compattazione dei file di dati non viene eseguita.

Per i file di log il Motore di database utilizza target_percent per calcolare le dimensioni di destinazione dell'intero log. Pertanto, target_percent corrisponde alla quantità di spazio disponibile nel log dopo la compattazione. Le dimensioni di destinazione per l'intero log vengono quindi convertite nelle dimensioni di destinazione per ogni file di log.

DBCC SHRINKDATABASE tenta di compattare immediatamente ogni file di log fisico fino alle dimensioni di destinazione specificate. Se i log virtuali non includono alcuna parte del log logico oltre le dimensioni di destinazione del file di log, il file viene troncato correttamente e DBCC SHRINKDATABASE viene completata senza visualizzare alcun messaggio. Se invece i log virtuali includono parti del log logico oltre le dimensioni di destinazione, il Motore di database libera la maggior quantità di spazio possibile e viene visualizzato un messaggio informativo in cui sono descritte le operazioni necessarie per estrarre le parti del log logico dai log virtuali alla fine del file. Dopo l'esecuzione di queste operazioni, è possibile utilizzare DBCC SHRINKDATABASE per liberare lo spazio rimanente. Per ulteriori informazioni, vedere Compattazione del log delle transazioni.

Poiché è possibile compattare un file di log solo fino al limite del file di log virtuale, potrebbe essere impossibile compattare un file di log fino a ottenere dimensioni inferiori rispetto a quelle del file di log virtuale, anche se non viene utilizzato. Le dimensioni del file di log virtuale vengono scelte in modo dinamico dal Motore di database durante la creazione o l'estensione dei file di log. Per ulteriori informazioni sui file di log virtuali, vedere Architettura fisica del log delle transazioni.

Procedure consigliate

Quando si pianifica la compattazione di un database, 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 spazio disponibile 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. Questo è un ulteriore motivo per evitare di compattare ripetutamente un database.
  • Se non è necessario soddisfare esigenze specifiche, non impostare l'opzione di database AUTO_SHRINK su ON.

Risoluzione dei problemi

È possibile che le operazioni di compattazione vengano bloccate da una transazione che utilizza 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 questo caso viene registrato un messaggio informativo nel log degli errori di SQL Server (il messaggio 5202 per SHRINKDATABASE e il messaggio 5203 per SHRINKFILE) ogni cinque minuti nella prima ora e quindi ogni ora. Ad esempio, il log degli errori può contenere il messaggio di errore seguente:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot 
transaction with timestamp 15 and other snapshot transactions linked to 
timestamp 15 or with timestamps older than 109 to finish.

Questo significa che l'operazione di compattazione è bloccata da transazioni snapshot con timestamp precedenti a 109, ovvero all'ultima transazione completata dall'operazione di compattazione. Questo indica inoltre che la colonna transaction_sequence_num o first_snapshot_sequence_num della vista a gestione dinamica sys.dm_tran_active_snapshot_database_transactions contiene il valore 15. Se la colonna transaction_sequence_num o first_snapshot_sequence_num della vista contiene un numero inferiore rispetto all'ultima transazione completata da un'operazione di compattazione, equivalente a 109, l'operazione di compattazione viene rimandata fino al completamento di tali transazioni.

Per risolvere il problema, è possibile eseguire una delle attività seguenti:

  • Terminare la transazione che blocca l'operazione di compattazione.
  • Terminare l'operazione di compattazione. Il lavoro completato fino a quel momento viene mantenuto.
  • Non eseguire alcuna operazione per consentire che l'operazione di compattazione venga rimandata fino al completamento della transazione di blocco.

Per ulteriori informazioni sul log degli errori di SQL Server, vedere Visualizzazione del log degli errori di SQL Server.

Autorizzazioni

È richiesta l'appartenenza al ruolo predefinito del server sysadmin o al ruolo predefinito del database db_owner.

Esempi

A. Compattazione di un database e specifica di una percentuale di spazio disponibile

Nell'esempio seguente vengono ridotte le dimensioni dei file di dati e di log nel database utente UserDB per ottenere il 10% di spazio disponibile nel database.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B. Troncamento di un database

Nell'esempio seguente i file di dati nel database di esempio AdventureWorks vengono compattati fino all'ultimo extent allocato.

DBCC SHRINKDATABASE (AdventureWorks, TRUNCATEONLY);

Vedere anche

Riferimento

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)

Altre risorse

File e filegroup fisici del database
Procedura: Compattazione di un database (SQL Server Management Studio)
Allocazione e riutilizzo dello spazio

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

14 aprile 2006

Nuovo contenuto:
  • Aggiunta dell'esempio B.
  • Aggiunta delle attività di risoluzione nella sezione "Risoluzione dei problemi".
  • Aggiunta delle informazioni relative all'opzione di database AUTO_SHRINK in "Procedure consigliate".
Contenuto aggiornato:
  • Chiarimento delle definizioni di TRUNCATEONLY e NOTRUNCATE.
  • Nella sezione Osservazioni correzione delle dimensioni minime fino a cui è possibile compattare un database.