現象
Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012、または SQL Server 2014 で、ラージオブジェクト (LOB) 列を含むテーブルがあることを前提としています。 Lob データのサイズが小さい LOB 列を更新して、次のメソッドを使用して未使用の領域を再利用する場合。
-
DBCC SHRINKDATABASE/DBCC SHRINKFILE
-
インデックスの再編成を変更する (LOB_COMPACTION = ON)
この場合、未使用の領域を解放することはできません。
解決方法
この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 2012 SP2 の累積更新プログラム2 /en-us/help/2983175
SQL Server 2012 SP1 の累積更新プログラム11 /en-us/help/2975396
SQL Server 2008 R2 SP2 の累積更新プログラム13 /en-us/help/2967540
SQL Server 2014 の累積更新プログラム2 /en-us/help/2967546
SQL Server 2008 SP3 の累積更新プログラム17 /en-us/help/2958696
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムを確認します。
回避策
この問題を回避するには、次の回避策を使用します。
-
すべての行を新しいテーブルにエクスポートし、行を元の位置に戻します。 LOB データを再編成し、未使用の領域を解放します。
-
[DBCC SHRINKFILE with EMPTYFILE] オプションを使用して、新しく追加されたデータファイルにすべてのデータを移動し、古いデータファイルを削除します。 これにより、使用されていない領域を解放して LOB データを再編成します。
詳細情報
次の例では、TSQL table_name sp_spaceused コマンドを使用して、使用されていないスペースを示しています。これには、lob データのサイズが小さい lob 列を更新する前と後に、次のようにします。更新する前に、次のように
氏名 |
行 |
保存 |
データ |
index_size |
しない |
table_name |
1000 |
261072 KB |
261056 KB |
16 KB |
0 KB |
更新後の操作:
氏名 |
行 |
保存 |
データ |
index_size |
しない |
table_name |
1000 |
261072 KB |
199672 KB |
16 KB |
61384 KB |
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。