我的一些SQL表有0行,但保留了大量的TotalSpace。这些SQL表用于临时保存数据(我不确定供应商为什么不使用临时表)。释放这个空间的唯一方法是重建表。我正在考虑通过在几个小时后运行下面的代码来自动化这个过程。
我注意到它还有助于对表进行碎片整理。
ALTER TABLE MyTableName REBUILD
9ceoxa921#
基本上,当你删除或截断大对象时(例如,消耗超过128个区的表/索引),释放过程会被延迟一段时间,并在后台完成。很有可能,直到你的提交被触发后一段时间,你才看到总的空间预留下降。有关如何工作的更多信息,请查看此知识库:http://msdn.microsoft.com/en-us/library/ms177495.aspx删除或重新生成大型索引,或者删除或截断大型表时,数据库引擎会将实际的页释放及其关联的锁延迟到事务提交之后。...物理阶段发生在事务提交之后。标记为释放的分配单元以物理方式成批删除。这些删除操作在后台发生的短事务内进行处理。并且不需要很多锁。如果你执意要重建这个表,应该不会有太多的开销,因为你已经声明了表中有0行。我不相信这会“修复”你所问的TotalSpace保留问题,但不必担心,因为如果需要向该表中填充更多数据,引擎将重用那些尚未释放的区段。你最好的选择是等待空间随着时间的推移自己释放出来。如果在物理阶段完成之前数据库增长需要此空间,则数据库引擎将尝试从标记为取消分配的分配单元中恢复空间。希望这能回答你的问题。约翰
sc4hvdpw2#
您真的应该问问供应商为什么产品会这样做,但我怀疑最终过程不会真正改变。这些表使用的空间,无论多么临时,都需要在您的增长计划中加以考虑。我猜它们用于预先计算各种应用程序统计信息,这意味着它们相对于其余数据的大小也会增长。
2条答案
按热度按时间9ceoxa921#
基本上,当你删除或截断大对象时(例如,消耗超过128个区的表/索引),释放过程会被延迟一段时间,并在后台完成。很有可能,直到你的提交被触发后一段时间,你才看到总的空间预留下降。
有关如何工作的更多信息,请查看此知识库:http://msdn.microsoft.com/en-us/library/ms177495.aspx
删除或重新生成大型索引,或者删除或截断大型表时,数据库引擎会将实际的页释放及其关联的锁延迟到事务提交之后。...物理阶段发生在事务提交之后。标记为释放的分配单元以物理方式成批删除。这些删除操作在后台发生的短事务内进行处理。并且不需要很多锁。
如果你执意要重建这个表,应该不会有太多的开销,因为你已经声明了表中有0行。我不相信这会“修复”你所问的TotalSpace保留问题,但不必担心,因为如果需要向该表中填充更多数据,引擎将重用那些尚未释放的区段。你最好的选择是等待空间随着时间的推移自己释放出来。
如果在物理阶段完成之前数据库增长需要此空间,则数据库引擎将尝试从标记为取消分配的分配单元中恢复空间。
希望这能回答你的问题。
约翰
sc4hvdpw2#
您真的应该问问供应商为什么产品会这样做,但我怀疑最终过程不会真正改变。这些表使用的空间,无论多么临时,都需要在您的增长计划中加以考虑。我猜它们用于预先计算各种应用程序统计信息,这意味着它们相对于其余数据的大小也会增长。