Sql-Server

如何回收堆使用的儲存空間?

  • September 21, 2017

我在 SQL Server 2008R2 Standard 中有一個沒有聚集索引的表,其中有很多未使用的空間,如下圖所示:

在此處輸入圖像描述

如何回收未使用的空間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
) 

我應該遵循哪些步驟來釋放未使用的空間?

如果您的表沒有聚集索引,則預設情況下刪除不會釋放空頁。

您的選擇是:

  • ALTER TABLE dbo.MyTable REBUILD - 這將使您的表在標準版中離線,建構它的新副本,所有內容都像沙丁魚一樣包裝得很好
  • 使用 TABLOCK 提示進行刪除- 這可能會證明並發性有問題,因為正如它所指示的那樣,將取出表鎖來執行刪除
  • 截斷表- 這將釋放所有頁面,而不僅僅是空頁面,因此它具有擦除所有數據的不幸缺點。
  • 在上面放一個聚集索引——如果你經常更新和刪除你的數據,那麼你應該像 Beyonce 說的那樣做:在上面放一個聚集索引。否則,您最終會遇到現在遇到的空白空間問題,以及forwarded-fetches 問題

引用自:https://dba.stackexchange.com/questions/186572