Reorganisasi dan menyusut tidak pernah disarankan.
Jika Anda dapat mengambil aplikasi yang dilayani database secara offline, Anda dapat mempercepat proses dan mengurangi fragmentasi indeks dengan menghapus semua indeks dan batasan kunci asing / kunci sebelum menyusut (ini akan berarti ada lebih sedikit data untuk dipindahkan karena hanya halaman data akan diacak bukan halaman indeks yang sekarang tidak ada, mempercepat proses) kemudian menciptakan kembali semua indeks dan kunci.
Menciptakan indeks setelah menyusut berarti tidak boleh terfragmentasi secara signifikan, dan setelah hilang selama menyusut berarti membangun kembali tidak akan meninggalkan banyak "lubang" kecil di alokasi halaman dalam file yang dapat mengundang fragmentasi nanti.
Opsi lain jika Anda dapat offline aplikasi adalah untuk memigrasi semua data ke database baru dari struktur yang sama. Jika proses build Anda solid, Anda seharusnya dapat membangun DB kosong itu dengan cepat, jika tidak membuatnya dari DB saat ini (mengembalikan cadangan yang sekarang, pangkas / hapus semua konten dalam tabel dan lakukan penyusutan penuh).
Anda mungkin masih ingin menghapus semua indeks di tujuan dan membuatnya kembali setelah itu karena ini bisa jauh lebih efisien ketika mengubah banyak data yang diindeks (100% dari itu dalam kasus ini). Untuk mempercepat proses penyalinan, minta file data dari database tujuan pada drive fisik yang berbeda ke sumbernya (kecuali jika Anda menggunakan SSD dalam hal ini Anda tidak perlu peduli untuk mengurangi pergerakan head), Anda dapat memindahkannya ke lokasi sumber ketika Anda selesai.
Juga, jika membuat tujuan sebagai baru (daripada dengan mengosongkan salinan sumber) buat dengan ukuran awal yang akan berisi semua data saat ini ditambah beberapa bulan pertumbuhan - yang akan membuat salinan data sedikit lebih cepat lagi sebagai itu tidak akan mengalokasikan ruang baru setiap saat selama proses.
Ini mungkin lebih baik daripada menggunakan shrink karena memigrasikan data ke database baru mereplikasi tindakan yang dimaksudkan dari operasi shrink, tetapi berpotensi dengan fragmentasi yang jauh lebih sedikit (yang merupakan konsekuensi yang tidak diinginkan dari reorganisasi dan penyusutan). Seorang psikiater hanya mengambil blok dari dekat akhir file dan menempatkan mereka di ruang pertama di dekat awal tidak berusaha untuk menjaga data terkait bersama.
Saya menduga hasilnya akan lebih hemat ruang-bijaksana juga karena ada kemungkinan akan lebih sedikit halaman yang digunakan setelahnya. Penyusutan hanya akan memindahkan halaman yang digunakan sebagian, memindahkan data lebih cenderung menghasilkan halaman penuh terutama jika Anda memasukkan ke tujuan dalam urutan kunci / indeks berkerumun tabel (di mana tabel memiliki satu) dan membuat indeks lainnya setelah semua data dimigrasikan.
Tentu saja jika Anda tidak dapat membuat aplikasi offline sama sekali, hanya menjalankan psikiater adalah satu-satunya pilihan Anda jadi jika Anda benar - benar perlu merebut kembali ruang dengan itu. Tergantung pada data Anda, pola akses, ukuran set kerja yang umum, berapa banyak RAM yang dimiliki server, dan sebagainya, fragmentasi internal tambahan mungkin tidak terlalu signifikan pada akhirnya.
Untuk operasi penyalinan, baik SSIS atau basis T-SQL akan bekerja dengan baik (opsi SSIS mungkin kurang efisien, tetapi berpotensi lebih mudah untuk dipertahankan nanti). Jika Anda membuat hubungan FK di bagian akhir bersama dengan indeks Anda dapat melakukan sederhana "untuk setiap tabel, salin" dalam kedua kasus. Tentu saja untuk sekali saja, psikiater + reorganisasi mungkin juga baik, tetapi saya hanya ingin menakut-nakuti orang agar tidak pernah mempertimbangkan psikiater biasa! (Saya sudah tahu orang menjadwalkannya setiap hari).