ShrinkDatabase SQL Server può causare problemi di frammentazione e di prestazioni

In SQL Server è possibile utilizzare il comando DBCC SHRINKDATABASE per ridurre lo spazio occupato dai file di dati e di log di un database.

ShrinkDatabase di SQL Server

Il problema con SHRINKDATABASE è che, contrariamente a quanto può sembrare, se non utilizzato con attenzione, il risultato può essere un significativo aumento della frammentazione degli indici e tabelle, che porta ad un peggioramento prestazioni delle nostre SQL Server, dati e anche una maggiore impronta quando colpiti da indici di frammentazione vengono ricostruiti.

Che cosa significa il comando di DBCC ShrinkDatabase

Il comando rilascia ridurre la spazio libero lasciato negli archivi della banca dati, facendolo 'ritorno' al sistema operativo piuttosto che essere riservato per la crescita dei dati. Riduzione dello spazio si verifica, ma si deve pensare alla crescita del database. Se lo spazio libero contiguo che utilizza ogni tabella non è di sinistra, verranno creati i nuovi dati in differenti luoghi fisici, la frammentazione aumenta, e indici e le specie sarà complicato.

Includere SHRINKDATABASE tra manutenzione quotidiana di SQLServer BD, per esempio, può causare un grave problema di frammentazione, in quanto i dati vengono inseriti possono essere conservati in un luogo fisico diverso per ogni nuovo giorno dopo l'implementazione ridursi.

Quando e come utilizzare SQL Server Shrink

Ma poi, SHRINK DATABASE utile? Chiaro che serve in alcuni casi. Se un database di SQL Server vengono eliminati o tabelle, che riducono notevolmente il volume occupato dai dati, e non vi è alcuna disposizione di rioccupare lo spazio sono troncati, potrebbe essere interessato a utilizzarlo per regolare al meglio la relazione tra spazio occupato e lo spazio riservato riducendo la dimensione del database, ma è sempre consigliabile lasciare una percentuale di spazio libero riservato per entrambe le operazioni giornaliere del database e per la crescita dei dati con la frammentazione minima.

In caso di utilizzo del SQLServer Shrink, al fine di garantire che lo spazio riservato e che la crescita non crea problemi di frammentazione e di prestazioni, è importante esaminare gli argomenti che supportano il comando come se il secondo argomento è segnalato con una riduzione numero lasciando spazio prenderà quel numero come percentuale di spazio inutilizzato che non viene restituito al sistema operativo.

Sintassi dei comandi

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

Esempio di utilizzo Shrink

Ad esempio, se solo facciamo operazioni di pulizia (eliminare programmi non utilizzati, temporanei o semplicemente tabelle inutili) nella nostra banca dati che conosciamo hanno ridotto lo spazio occupato dai dati del 50%, e vogliamo ridurre lo spazio occupato da file nel database, ma lasciando spazio a parte il 15% per le operazioni quotidiane, e di crescita che ci aspettiamo nel database per l'anno in corso, abbiamo potuto eseguire questo comando:

DBCC SHRINKDATABASE (Mi_base_de_datos, 15);

Così lo spazio occupato dai file di dati e il database di registro sarebbe ridotto di circa il 35%. Se non abbiamo incluso il parametro di percentuale ridurrebbe più spazio, ma il giorno dopo i nuovi inserti di dati e cominciare a richiedere aumenti la dimensione del file, ovviamente, non essere nello stesso spazio fisico dati esistenti, e aumentare la frammentazione dei dati.

Raccomandazione per ridurre la frammentazione

E parlando di frammentazione, per cui si consiglia di includere nei compiti di manutenzione periodica è una ricostruzione degli indici con RICOSTRUIRE, che riducono la frammentazione e migliorare le prestazioni del DB, anche se può aumentare un po 'più di spazio utilizzati:

ALTER INDEX REBUILD idx_mitabla_ID ON MyTable;

Riferimenti

Infine, mi collego riferimento alcuni post del blog da altri siti che spiegano il motivo per cui  fare un database Shrink solito non è una buona idea , forniscono motivi per non usare un ShrinkDatabase , o facendo una dimostrazione pratica di ciò che accade per lo spazio e la frammentazione fare un ShrinkDatabase

Sapete più in questo caso o meno opportuno fare un Shrink? Hai trovato un problema in occasione o la frammentazione delle prestazioni causati da un uso sfortunato di ShrinkDatabase?