某些SQL表有0行,但却保留了大量的TotalSpace。这些SQL表用于临时保存数据(我不确定供应商为什么不使用临时表)。我可以释放这个空间的唯一方法是重建表格。我想通过在下班后运行下面的代码来自动执行此过程。重建表是否有任何缺点。我注意到它也有助于整理表格。
Alter tableABC Rebuild
答案 0 :(得分:0)
基本上,当您删除或截断大型对象(例如,消耗超过128个范围的表/索引)时,释放过程会在一段时间内延迟并在后台完成。在您的提交被解雇之后,您可能无法看到保留的总空间下降。
有关其工作原理的详细信息,请查看此KB:http://msdn.microsoft.com/en-us/library/ms177495.aspx
当您删除或重建大型索引,或删除或截断大型表时,数据库引擎会延迟实际的页面解除分配及其关联的锁定,直到事务提交为止。 ...物理阶段发生在事务提交之后。标记为取消分配的分配单元实际上是分批丢弃的。这些丢弃是在后台发生的短事务中处理的,并且不需要很多锁。
如果您在重建表格时已经死了,那么就不应该有很多开销,因为您已经说明其中有0行。我不相信这会"修复"您要问的TotalSpace保留问题,但它不应该担心,因为如果您需要将更多数据填充到该表中,引擎将重用那些尚未释放的扩展区。你最好的选择是等待空间随着时间的推移自由释放。
如果数据库在物理阶段完成之前需要此空间,则数据库引擎会尝试从标记为重新分配的分配单元中恢复空间。
希望这有助于回答你的问题。
约翰
答案 1 :(得分:0)
你应该问供应商为什么产品会这样做,但我怀疑最终这个过程不会真正改变。这些表格所使用的空间,无论如何暂时,都需要在您的增长计划中加以考虑。我的猜测是它们用于预先计算各种应用程序统计数据,这意味着它们的大小也会相对于其他数据增长。