Una riorganizzazione e riduzione non è mai davvero raccomandata.
Se riesci a portare offline le app che il database sta servendo, puoi velocizzare il processo e ridurre la frammentazione degli indici rimuovendo tutti gli indici e i vincoli di chiave primaria / esterna prima della riduzione (ciò significa che ci sono meno dati da spostare in quanto solo il le pagine di dati verranno mescolate non le pagine di indice ora inesistenti, accelerando il processo), quindi ricreano tutti gli indici e le chiavi.
Ricreare gli indici dopo la riduzione significa che non dovrebbero essere frammentati in modo significativo, e averli spariti durante la riduzione significa che ricostruirli non lascerà molti piccoli "buchi" nell'allocazione della pagina all'interno dei file che potrebbero invitare la frammentazione in un secondo momento.
Un'altra opzione se è possibile offline le applicazioni è migrare tutti i dati su un nuovo database della stessa struttura. Se il tuo processo di compilazione è solido, dovresti essere in grado di creare rapidamente quel DB vuoto, se non crearne uno dal DB corrente (ripristinare un backup di quello corrente, troncare / eliminare tutto il contenuto delle tabelle ed eseguire una riduzione completa).
Potresti comunque voler eliminare tutti gli indici nella destinazione e ricrearli in seguito poiché ciò può essere molto più efficiente quando si modificano molti dati indicizzati (in questo caso il 100%). Per accelerare il processo di copia, disporre i file di dati del database di destinazione su diverse unità fisiche all'origine (a meno che non si utilizzino SSD nel qual caso non è necessario preoccuparsi di ridurre i movimenti della testa), è possibile spostarli alla posizione di origine quando hai finito.
Inoltre, se si crea la destinazione come nuova (anziché cancellando una copia della fonte) crearla con una dimensione iniziale che conterrà tutti i dati correnti più alcuni mesi di crescita - ciò renderà i dati una copia un po 'più veloce come non assegnerà nuovo spazio ogni tanto durante il processo.
Questo potrebbe essere meglio dell'uso della riduzione perché la migrazione dei dati a un nuovo database replica l'azione prevista dell'operazione di riduzione, ma potenzialmente con una frammentazione molto inferiore (che è la conseguenza non intenzionale di una riorganizzazione e riduzione). Un restringimento prende semplicemente i blocchi dalla fine del file e li mette nel primo spazio più vicino all'inizio senza fare sforzi per mantenere insieme i dati correlati.
Ho il sospetto che il risultato sarà anche più efficiente in termini di spazio in quanto in seguito ci saranno probabilmente meno pagine parzialmente utilizzate. Un restringimento sposta semplicemente le pagine parzialmente utilizzate, spostando i dati è più probabile che si traducano in pagine intere soprattutto se si inserisce nella destinazione nell'ordine della chiave / indice cluster di una tabella (dove una tabella ne ha una) e crea altri indici dopo che tutti i dati sono stati migrati.
Ovviamente se non riesci a portare offline le app, eseguire solo una riduzione è la tua unica opzione, quindi se hai davvero bisogno di recuperare lo spazio vai con quello. A seconda dei dati, dei modelli di accesso, delle dimensioni comuni del set di lavoro, della quantità di RAM del server e così via, la frammentazione interna aggiuntiva potrebbe non essere poi così significativa alla fine.
Per l'operazione di copia, SSIS o T-SQL di base funzionerebbero altrettanto bene (l'opzione SSIS potrebbe essere meno efficiente, ma potenzialmente più facile da mantenere in seguito). Se crei le relazioni FK alla fine insieme agli indici, puoi fare un semplice "per ogni tabella, copia" in entrambi i casi. Naturalmente per una volta, una riduzione + riorganizzazione probabilmente va bene, ma mi piace solo spaventare le persone affinché non prendano mai in considerazione le riduzioni regolari! (Ho conosciuto gente programmarli tutti i giorni).