最近,我不再只是在文件利用率接近 80% 时才增加文件,而是通过整理堆碎片、添加和删除聚集索引、实现行或页面压缩等常用技巧来更主动地回收空间。
但是,在某些情况下,我可以通过执行DBCC CLEANTABLE来回收更多空间。在我的环境中有数百个数据库,不可能知道用户在每个数据库中做了什么,并且完全可以接受涉及删除固定长度列的更改。我通常通过查看我编写的一些对象空间利用率脚本中的行数与页数来发现这些机会。我想通过尝试自动检测这些场景来更进一步。
我想知道的是,是否有人在积极监测这些机会,如果是,你具体寻找什么?
我的想法是按照收集行的最大和最小大小、表中的行数、分配的页数和使用的页数,然后做一些基本的数学运算来记录结果远远超出“预期”的范围。
对于这个问题,我想到的解决方案是每周运行一个作业,该作业将为数据库中的所有表运行sp_spaceused并将这些数据保存在一个表中。如果每个表的大小差异大于..比方说..10%,我会运行 dbcc cleantable。
我循环遍历表大小的代码如下所示:
现在您只需要构建将验证一周内大小变化的逻辑并安排它。