我有一个INSERT
语句,它占用了大量的日志空间,以至于硬盘驱动器在语句完成之前实际上已经填满了。
问题是,我确实不需要记录它,因为它只是一个中间数据上传步骤。
为了论证,让我说我有:
bcp
填充,因此没有记录问题)INSERT INTO B from A
有没有一种方法可以在A和B之间复制而不会将任何内容写入日志?
P.S。我正在使用 SQL Server 2008 和简单恢复模式。
答案 0 :(得分:4)
没有办法插入 完全记录。 SELECT INTO是 最小化T-SQL中的日志记录的最佳方法, 使用SSIS你可以做同样的事情 使用批量插入进行光记录。
根据您的要求,我愿意 可能使用SSIS,全部丢弃 约束,特别是独特和 主键,加载数据, 添加约束。我加载 在短短一个多小时内就像100GB一样 这个,开销相当小。一世 我正在使用BULK LOGGED恢复模型, 这只记录了新的存在 记录期间的范围,然后 你可以稍后删除它们。
关键是从准系统开始 桌子,它只是尖叫。建造 索引一旦离开你就不会 索引维护,只有一个 每个索引的索引构建。
如果您不想使用SSIS,则该点仍然适用于删除所有约束并使用BULK LOGGED
恢复模型。这大大减少了对INSERT INTO
语句的日志记录,因此可以解决您的问题。
答案 1 :(得分:3)
将数据上传到tempdb而不是数据库,并在tempdb中执行所有中间转换。然后仅将最终数据复制到目标数据库中。使用批次可以最小化单个事务的大小。如果您仍有问题,请查看部署跟踪标记610,请参阅The Data Loading Performance Guide和Prerequisites for Minimal Logging in Bulk Import:
跟踪标志610
SQL Server 2008引入了跟踪标志 610,控制最小记录 插入到索引表中。