Sql-Server
如何回收堆使用的儲存空間?
我在 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 問題。