如何回收堆使用的存储空间?

DAV*_*VID 5 sql-server storage sql-server-2008-r2

我在 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
) 
Run Code Online (Sandbox Code Playgroud)

我应该遵循哪些步骤来释放未使用的空间?

Bre*_*zar 16

如果您的表没有聚集索引,则默认情况下删除不会释放空页。

您的选择是:

  • ALTER TABLE dbo.MyTable REBUILD - 这将使您的表在标准版中脱机,构建它的新副本,其中所有东西都像沙丁鱼一样包装得很好
  • 使用 TABLOCK 提示进行删除- 这可能会导致并发问题,因为正如它所指示的那样,将取出表锁来进行删除
  • 截断表- 这将释放所有页面,而不仅仅是空页面,因此它具有擦除所有数据的不幸缺点。
  • 在上面放一个聚集索引——如果你经常更新和删除你的数据,那么你应该像碧昂斯说的那样:在它上面放一个聚集索引。否则,您最终会遇到您现在遇到的空白空间问题,以及转发提取问题

  • @jpmc26“如果你[经常更新和删除数据]它,那么你应该在它上面放一个[聚集索引]” (2认同)