SQL Server 内のテーブルからデータを削除する DELETE ステートメントを使用した後、テーブルを使用する領域が完全に解放しません。

Bug #: 219514 (SQL Server 8.0)
BUG #: 219514 (SQL Server 8.0)バグ #: 50749 (コンテンツ管理)

現象

Microsoft SQL Server のテーブルからデータを削除する DELETE ステートメントを使用した後、テーブルを使用する領域が完全に解放されない場合があります。データベースにデータを挿入しようとすると、次のエラー メッセージが表示される場合があります。
[プライマリ ファイル グループがいっぱいなので、データベース 'データベース名' のオブジェクト 'テーブル名' の領域を割り当てられませんでした。
テーブル名は、テーブルの名前を表します。データベース名は、テーブルを含むデータベースの名前を表します。

原因

この問題は、SQL Server の次の条件に該当する場合、ヒープ テーブルが使用しているすべてのページにだけ解放するために発生します。
  • このテーブルの削除が発生します。
  • テーブル レベルのロックが保持されています。
注: ヒープ テーブルとは、クラスター化インデックスに関連付けられていない任意のテーブルです。

ページの割り当ては解除されませんが、データベース内の他のオブジェクトは、ページを再利用できません。

ただし、SQL Server 2005 データベース内の行バージョン管理ベースの分離レベルを有効にすると、ページを解放できません、テーブル レベルのロックが保持されている場合でも。行バージョン管理ベースの分離レベルの詳細については、SQL Server 2005 Books Online の「を使用する行バージョン管理ベースの分離レベル」を参照してください。

回避策

この問題を回避するには、以下のいずれかの方法を使用します。

  • 行バージョン管理ベースの分離レベルが有効になっていない場合は、TABLOCK ヒント DELETE ステートメントに含まれます。たとえば、次のようなステートメントを使用します。
    DELETE FROM <TableName> WITH (TABLOCK)
    < TableName >では、テーブルの名前を表します。
  • テーブル内のすべてのレコードを削除する場合は、TRUNCATE TABLE ステートメントを使用します。たとえば、次のようなステートメントを使用します。
    TRUNCATE TABLE <TableName>
  • テーブルの列にクラスター化インデックスを作成します。テーブルにクラスター化インデックスを作成する方法の詳細については、SQL Server Books Online の「、のクラスター化インデックスの作成」トピックを参照してください。

状況

マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。
プロパティ

文書番号:913399 - 最終更新日: 2017/02/02 - リビジョン: 1

フィードバック