SQL Server移动"表空闲空间"到"数据库可用空间"

时间:2017-09-27 10:28:49

标签: sql-server

我有一个相当大的数据库(最多几百个每日碎片日历表,mdf文件总共1.3TB)。

现在我们要尽力阻止mdf进一步增长,我们会尽可能多地从现有表中删除不必要的数据。

我们所知道的:

  1. 从表中删除数据不会减少mdf文件的大小。
  2. 缩小文件/数据库是不可能的。
  3. 从旧表中删除(比如table_20161231)不会将空间释放到新表的数据库(比如table_20170927),除非重建旧表。
  4. 所以我们理解表重建是必要的,根据" exec sp_spaceused"的结果,改变索引似乎没有帮助,空间仍未释放。

    因此我们现在正在做以下事情:

    1. 从table_20161231删除数据='不必要';
    2. 从table_20161231
    3. 中选择*进入table_20161231_compact
    4. drop table table_20161231
    5. 执行" exec sp_spaceused"通过拥有更多未分配的空间"似乎再次显示出积极的结果。对于新表。

      有没有人知道1行方法来释放已删除数据的空间?

2 个答案:

答案 0 :(得分:0)

当您从表中删除时,SQL Server会保留该空间以供重用,因为它假定它最终会被填充。如果你想要它回来,不幸的是,偷懒是唯一的方法。它可能充满了危险,但作为一个你知道数据不会再增长到那个大小并且你在那之后处理索引碎片的问题就应该没问题......

您完成它的方式可能是最安全的方法,您可以编写脚本并使用sp_rename来更改表名。

迈克·沃尔什(Mike Walsh)做了一个关于缩小HERE

时会发生什么的体面博客

答案 1 :(得分:0)

所以你从堆中删除。如果您只删除行,则堆不释放空间,可能的解决方法是创建聚簇索引或使用tablock删除:

Deleting Rows by Using DELETE

  

从堆中删除行从堆中删除行时,数据库引擎可以使用行或页锁定进行操作。作为一个   结果,删除操作使空的页面保持分配状态   到了堆。当空页面未被释放时,关联   空间不能被数据库中的其他对象重用。删除   堆中的行和取消分配页面,请使用以下方法之一。

     
      
  • 在DELETE语句中指定TABLOCK提示。使用TABLOCK提示会导致删除操作在表上执行共享锁定   而不是行或页锁。这允许页面为
      释放。有关TABLOCK提示的更多信息,请参阅表
      提示(Transact-SQL)。
  •   
  • 如果要从表中删除所有行,请使用TRUNCATE TABLE。
  •   
  • 在删除行之前在堆上创建聚簇索引。删除行后,可以删除聚簇索引。这种方法
      比以前的方法更耗时并且使用更多   临时资源。
  •   

如果你不知道如何使用tablock这是一个例子:

delete dbo.myTbl with(tablock)
where...

P.S。

  

因此我们现在正在做以下事情:

delete from  where data = 'unnecessary';
select * into table_20161231_compact from table_20161231
drop table table_201table_2016123161231
     

有没有人知道1行方法来释放已删除数据的空间?

是的,它可以在SQL Server 2008开始的1个命令中完成:

alter table table_20161231 rebuild