web-dev-qa-db-ja.com

ヒープが使用するストレージスペースを再利用する方法

次の画像に示すように、SQL Server 2008R2 Standardにクラスタードインデックスのないテーブルがあり、未使用のスペースがたくさんあります。

enter image description here

MyTableから未使用のスペースを再利用するにはどうすればよいですか?

このテーブルは次のように宣言されています。

CREATE TABLE [dbo].[MyTable](
    [RecordID] [varchar](50) NULL,
    [DocumentID] [nvarchar](100) NULL,
    [DocumentName] [varchar](100) NULL,
    [DocumentOwner] [varchar](50) NULL,
    [DocumentTemplate] [varchar](50) NULL,
    [DocumentData] [ntext] NULL,
    [DocumentDate] [char](10) NULL,
    [DocumentTime] [char](10) NULL,
    [DocumentSize] [int] NULL,
    [DocumentUpdateVersion] [int] NULL,
    [SecondaryStorageURI] [varchar](150) NULL,
    [PreviousExportUri] [varchar](150) NULL
) 

未使用のスペースを解放するには、どのような手順に従う必要がありますか?

5
DAVID

テーブルにクラスター化インデックスがない場合、デフォルトでは、削除によって空のページが割り当て解除されることはありません。

オプションは次のとおりです。

  • ALTER TABLE dbo.MyTable REBUILD-Standard Editionでテーブルをオフラインにし、イワシのようにすべてがうまくパックされた新しいコピーを作成します
  • TABLOCKヒントを使用して削除を実行します-これは、同時実行性に問題があることを証明できます。
  • テーブルを切り捨てます-空のページだけでなく、すべてのページの割り当てを解除するため、すべてのデータが消去されるという残念な欠点があります。
  • クラスタードインデックスをその上に置く-データを頻繁に更新および削除する場合は、ビヨンセが言うように、クラスタードインデックスをその上に置く必要があります。それ以外の場合は、現在発生している空スペースの問題に加えて 転送されたフェッチの問題 になります。
14
Brent Ozar

テーブル構造を考えると、未使用のスペースはおそらく[DocumentData]の削除によるものです。ヒープであるという事実は、この問題にとってそれほど重要ではありませんが、ソリューションを少し単純化します。

テーブルの名前を変更し、保存したバージョンから新しいテーブルにデータをコピーして、古いテーブルを削除します。

- ステップ1

sp_rename 'dbo.MyTable','dbo.MyTable_sav'

- ステップ2

SELECT [RecordID],
    [DocumentID],
    [DocumentName],
    [DocumentOwner],
    [DocumentTemplate],
    [DocumentData],
    [DocumentDate],
    [DocumentTime],
    [DocumentSize],
    [DocumentUpdateVersion] ,
    [SecondaryStorageURI] , 
    [PreviousExportUri]  
INTO dbo.MyTable
FROM dbo.MyTable_sav

-手順1と2を確認します

DROP TABLE dbo.MyTable_sav
2
M. Mullane