再編成と縮小は決して推奨されません。
データベースがオフラインで提供しているアプリを使用できる場合、縮小前にすべてのインデックスとプライマリ/外部キー制約を削除することにより、プロセスを高速化し、インデックスの断片化を減らすことができます(これにより、移動するデータが少なくなりますデータページは現在存在しないインデックスページではなくシャッフルされ、プロセスが高速化されます)、すべてのインデックスとキーが再作成されます。
縮小後にインデックスを再作成すると、インデックスが大幅に断片化されることはなくなり、縮小中にインデックスを再構築しても、後で断片化を引き起こす可能性のあるファイル内のページ割り当てに多くの小さな「穴」が残らないことを意味します。
アプリケーションをオフラインにできる別のオプションは、すべてのデータを同じ構造の新しいデータベースに移行することです。ビルドプロセスが安定している場合、現在のDBから空のDBをすばやく作成できます(現在のDBから作成しない場合は、現在のDBのバックアップを復元し、テーブル内のすべてのコンテンツを切り捨て/削除し、完全に縮小します)。
宛先のすべてのインデックスを削除し、後で再作成することをお勧めします。これは、多くのインデックス付きデータ(この場合は100%)を変更する場合により効率的であるためです。コピープロセスを高速化するには、ソースとは別の物理ドライブにある宛先データベースのデータファイルを使用します(SSDを使用している場合は、頭の動きを減らす必要はありません)、それらを移動できます完了したら、ソースの場所に移動します。
また、(ソースのコピーを空白にするのではなく)宛先を新規として作成する場合、現在のすべてのデータと数か月分の成長を含む初期サイズで作成します。これにより、データコピーが少し速くなります。プロセス全体で新しいスペースが割り当てられることはありません。
データを新しいデータベースに移行すると、縮小操作の意図したアクションが複製されるため、これは縮小を使用するよりも優れている可能性がありますが、断片化ははるかに少ない可能性があります(再編成と縮小の意図しない結果です)。縮小は、ファイルの終わり近くからブロックを取得し、それらを最初の近くの最初のスペースに配置するだけで、関連するデータをまとめる努力をしません。
後で部分的に使用されるページが少なくなる可能性が高いため、結果はスペース的にも効率的であると思われます。縮小は部分的に使用されるページを移動するだけで、特にテーブルのクラスター化キー/インデックス(テーブルに1つがある)の順序で宛先に挿入し、他のインデックスを作成する場合、データを移動するとページ全体になりやすくなりますデータがすべて移行された後。
もちろん、アプリをまったくオフラインにできない場合は、縮小を実行するだけが唯一のオプションなので、本当にスペースを取り戻す必要がある場合は、それに合わせてください。データ、アクセスパターン、一般的なワーキングセットのサイズ、サーバーに搭載されているRAMの容量などによっては、余分な内部フラグメンテーションが最終的にそれほど重要ではない場合があります。
コピー操作の場合、SSISまたはベースT-SQLのどちらでも同様に機能します(SSISオプションの効率は低下する可能性がありますが、後で維持する方が簡単になる可能性があります)。インデックスとともにFKリレーションシップを最後に作成する場合、どちらの場合でも「テーブルごとにコピー」を行うことができます。もちろん、1回限りのシュリンク+再編成もおそらく大丈夫ですが、私は人々を怖がらせて、通常のシュリンクを決して考えないようにします!(私は人々が毎日それらをスケジュールすることを知っています)。