none
关于drop表之后空间释放的问题 RRS feed

  • 问题

  • 今天为了省事直接将3个数据量很大的表给drop掉了,这三张表占据的空间应该有超过200G,DROP掉之后我又用了DBCC SHINKFILE的语句将表所在的数据文件进行压缩,可是压缩完成后却发现数据文件并没有显著减小,后来去查看MSDN里关于DROP命令的解释也没有找到删除大容量数据表后空间释放相关的内容。正在困惑的时候又看了一下数据文件却发现容量已经减少了很多。看来DROP大容量的表以后空间是缓慢释放的,想请教下论坛里的达人们这个过程具体是怎样的呢?

    2011年7月13日 6:38

答案

全部回复

  • DBCC SHINKFILE会释放。你可能是DBCC SHINKFILE完成后没有刷新,所以没有立即发现空间减少。
    想不想时已是想,不如不想都不想。
    2011年7月13日 7:11
    版主
  • 你好,

    请问你在运行DBCC SHINKFILE 语句的时候,有没有错误提示? 你用的是SQL Server 2005 SP2版本么?关于DROP大容量数据库表格 后空间释放的问题,请参考这个帖子:SQL Server 2005 - Massive 400GB table dropped - space not released


    Best Regards,
    Stephanie Lv

    • 已标记为答案 XQ_NEW 2011年7月14日 1:48
    2011年7月13日 8:20
  • 你好,

    请问你在运行DBCC SHINKFILE 语句的时候,有没有错误提示? 你用的是SQL Server 2005 SP2版本么?关于DROP大容量数据库表格 后空间释放的问题,请参考这个帖子:SQL Server 2005 - Massive 400GB table dropped - space not released


    Best Regards,
    Stephanie Lv


    Stephen ,你好:

      我用的sql版本是sql server 2008,所以应该不存在你让我看的参考贴里说的bug问题。我执行的是DBCC SHINKFILE('DBNAME',TRUNCATEONLY),执行之后的返回是正常结果,没有错误提示。不过你给的参考贴里还是有一些提示的,貌似跟脏数据清理器(ghost cleanup)有关系。据说如果删除有聚集索引的表里的数据的时候,这些数据先会被标记为ghost record,然后有一个ghost cleanup 线程会每5秒运行一次删除这些脏数据,如果真是这样那就解释了为什么大容量数据表被drop掉会有延迟的现象了。下次如果还要做这样的操作我会进行下trace,论证下这个说法。

    谢谢怡红版主和stephen的解答!

    2011年7月14日 2:00
  • 你好,

    你的想法是正确的。被删除的数据只是被标记为ghost record,也就是逻辑上的删除,而不是物理上的删除。当下次扫描到该页面的时候,ghost cleanup task才会发现有ghost record,然后去执行cleanup 操作。

    这里有一篇blog是关于数据库引擎内部对幽灵数据的处理,可能对你有帮助:Inside the Storage Engine: Ghost cleanup in depth


    Best Regards,
    Stephanie Lv

    2011年7月14日 4:19
  • LZ您好,我觉得ghost record跟您这里的收缩数据库DBCC SHINKFILE('DBNAME',TRUNCATEONLY)没有多大关系

    首先ghost record存在于聚集索引表和使用快照隔离级别的堆表

    而且他会隔5秒sql2005或者10秒sql2008清理一次,所以LZ应该像怡红公子大侠说得那样

    DBCC SHINKFILE完成后刷新一下


    给我写信: QQ我:点击这里给我发消息

    2013年6月13日 16:34