web-dev-qa-db-ja.com

SQL Serverデータベースから未割り当て領域を削除するにはどうすればよいですか?

最近縮小されたデータベースがあり、sp_spaceusedを実行すると、500MBの未割り当て領域があることがわかります。このデータベースを特定のサイズに維持しようとしています(デスクトップユーザーのMSDEサイズ制限を適用します)が、未割り当て領域がデータベース全体のサイズに影響するかどうかわかりません。この未割り当て領域をデータベースから削除する方法はありますか?

2
Sean Howat

データファイルの縮小の実行には十分注意してください。使用するアルゴリズムが原因でインデックスの断片化が発生します(私はMSでコードを所有していました)。私が書いたこのブログ投稿には、私が何を意味するかを示すサンプルスクリプトが含まれています 自動縮小–オフにしてください! 。ブログ投稿のタイトルは自動縮小に関するものですが、手動のデータファイル縮小ではSQL Serverとまったく同じコードが使用されるため、同じ問題が発生します。

カイルが言うように、TRUNCATEONLYオプションのみを使用している場合、データの移動は行われず、断片化も発生しません。

データベースにインデックスがある場合、2つのオプションがあります。

  1. シュリンクを実行し、後でインデックスの断片化を削除します。ただし、インデックスの再構築を使用してそれを行わないでください(新しいインデックス用のスペースのためにデータベースを再度拡張する必要があるため)。古いDBCCINDEXDEFRAGを使用するか、ALTER INDEX ... REORGANIZEを置き換えます。動作に必要なデータページは1つだけなので、データベースが再び拡張されることはありません。
  2. データベースに別のファイルグループを作成し、CREATE INDEX ... WITH DROP_EXISTING構文を使用してすべてのインデックスをデータベースに移動してから、古いファイルグループを削除します。

お役に立てれば!

6
Paul Randal

DBCC SHRINKFILE を参照してください

1
SqlACID

SqlACIDは正しく、TRUNCATEONLYまたはtarget_sizeを具体的に見てください

1
Kyle Sonaty

なぜ縮小したいのですか?データベースは、より多くのデータがデータベースに格納されるにつれて大きくなる傾向があります。それは彼らの本質です。データファイルに未使用のスペースがあることには何の問題もありません。実際、SQLはファイルにいくらかの空き領域を必要とします。

縮小すると大規模な断片化が発生し、次にデータが追加されたときにデータファイルが再び大きくなります。その場合、ファイルが展開されるにつれてシステム全体の速度が低下します(特に、インスタント初期化がオンになっていない場合)。また、縮小と拡大を繰り返すと、ファイルシステムレベルで断片化が発生し、修正が困難になります。

0
GilaMonster

150 GB程度の巨大な未割り当て領域が表示された場合は、縮小することをお勧めします。 sp_spaceusedがhighunallocatedと言っているケースを1つ見ましたが、DBCCSHRINKFILEは役に立ちません。それで、そのシナリオでターゲット側を使用する必要があるか、または強制的に言わなければなりませんか

0
John