我们有一个数据库,其中有大量数据存储在varbinary(max)类型的字段中。在某些时候,我们可以清除大多数行的数据,但不是全部。我们的计划是使该字段可以为空,并在不再需要时简单地将数据清空。一旦我们这样做了,我们就想减小数据库的大小。实现这一目标的最佳方法是什么?
如果当前设置没有回收空间的好方法,我的一个想法是将该数据字段移动到只有两列的单独表中:主表的键和数据字段。然后我们可以在不再需要这些行时简单地删除它们。(然后进行某种收缩。)但是,与简单地使现有字段可为空相比,这将是一个更困难的更改。
注意:我实际上并不太关心使数据库文件更小,但我确实关心新释放的空间变得可重用。
超过 90% 的数据库大小是这一字段。我已经3TB了。
在我看来,只是将列更新为
NULL
将释放页面以供重用。这是一个非常 Scottish® 的演示,以庆祝它几乎是美国东部标准时间下午 5 点。插入行后,让我们检查索引页。
插入后,我得到了这个。实际页面可能因您而异。
让我们
NULL
出来一些行!并返回我们的页面:
所以页数减少了。嘘!对于接触我们
VARBINARY
数据的两个索引,它们丢失了一堆页面。这意味着它们将重新流通以供其他对象使用。由于我在 tempdb 中,它们可能很快就会被这里发生的所有垃圾内容吞噬。Now let's put some data back in:
并重新签入:
页数略有增加。
因此,看起来您不必做任何太疯狂的事情,甚至无需缩小数据库即可重用空间。我认为您将删除列的行为
DBCC CLEANTABLE
与您实际正在做的事情混为一谈。希望这可以帮助!