Tom*_*asz 5 sql-server dbcc sql-server-2016
我有一个非常大的表,有 5 亿行和一个文本列,我将删除它。在我的开发环境中,我已经删除了列并开始了回收过程,但我不确定“DBCC CLEANTABLE (MyDb,'dbo.LargeTbl, 100000)”语句中的批处理大小实际上是什么。
我尝试将其设置为 5,希望它检查前 5 行并结束。“DBCC CLEANTABLE (MyDb,'dbo.LargeTbl, 5)”,耗时 28 小时。所以我恢复了数据库,将其设置为 100,000,花了 4 个小时
实际问题:批处理大小是否告诉 dbcc cleantable 一次要执行多少行,并一次连续运行 100K 直到它通过所有 500 百万行?或者一旦我运行了 100,000 行,我是否必须再次运行它直到我完成所有 5 亿行?
在我的第二次测试中,(运行 100K 一次)我能够回收 30GB。然后我对所有索引运行了索引重组并回收了额外的 60GB ..
除了armitage的出色回答之外,您可能不需要在您的场景中使用 DBCC CLEANTABLE。
你说
然后我对所有索引运行了索引重组并回收了额外的 60GB ..
Microsoft 文档中的最佳实践说:
DBCC CLEANTABLE 不应作为日常维护任务执行。相反,在对表或索引视图中的可变长度列进行重大更改后使用 DBCC CLEANTABLE,并且需要立即回收未使用的空间。或者,您可以重建表或视图上的索引;然而,这样做是一种资源密集型操作。
时间和空间似乎是你最大的目标。通常重建索引比重组更快(但资源密集型)。
当您在开发服务器上工作时。
只需重建您的索引,您就会同时获得索引重组和 DBCC CLEANTABLE 的好处,而且速度可能会快得多。
注意重建和重组不是一回事:
小智 4
根据Microsoft 文档,Batch Size 告诉 DBCC CleanTable 每个事务要处理的行数。这与 DBCC CleanTable 进程运行时内部处理的行数有关。
通过采用文档中的示例并进行修改以添加一百万行,然后使用不同的批处理大小值多次运行示例脚本(见下文),看来指定较小的批处理大小会增加执行时间,因为 DBCC CleanTable 仅在运行根据批量大小中指定的行数。