从SQL Server 2005数据库中删除大型二进制列的最佳方法是什么,但最小化了生成的.mdf和.ldf文件的大小?
我们的应用程序曾用于允许用户上传他们的文档。它们作为BLOB存储在文档表的列中。随着时间的推移,该表增长到大于整个数据库大小的90%。
我们已经改变了一些东西,不再需要存储这样的文档了。我现在想要将此列中的数据归零,并使数据库恢复到可管理的大小(磁盘空间有点溢价)。作为一个遗留应用程序,我想保持兼容性而不是改变表的结构。
最明显的方法是做一些事情:
update documents set content = 0x0
但它似乎大大超出了.ldf。
解决特定症状,然后我可以截断日志(backup log mydb with truncate_only
)或尝试dbcc shrinkdatabase(mydb)
或dbcc shrinkfile(mydb_log, 20)
,但我听说这些会导致令人讨厌的碎片等。从长远来看可能不是最好的。
使用除内容列以外的所有内容创建第二个表格会更好吗,复制数据然后truncate
第一个?
任何想法都会受到赞赏。
干杯
答案 0 :(得分:2)
尝试删除列:
ALTER TABLE foo
DROP COLUMN foo.name
答案 1 :(得分:0)
是的,你想从第一个减去内容列创建第二个表然后截断原始表可能是最有效的。
答案 2 :(得分:0)
从实验中,似乎没有一个神奇的子弹。
这两个建议都允许我删除大内容而不会大幅增加.ldf大小,但是,之后减小.mdf大小的唯一方法就是像dbcc shrinkdatabase那样以页面碎片为代价。