最小记录插入

时间:2011-06-07 14:07:17

标签: sql sql-server-2008 logging insert bulkinsert

我有一个INSERT语句,它占用了大量的日志空间,以至于硬盘驱动器在语句完成之前实际上已经填满了。

问题是,我确实不需要记录它,因为它只是一个中间数据上传步骤。

为了论证,让我说我有:

  • 表A:初始上载表(使用bcp填充,因此没有记录问题)
  • 表B:使用INSERT INTO B from A
  • 填充

有没有一种方法可以在A和B之间复制而不会将任何内容写入日志?

P.S。我正在使用 SQL Server 2008 简单恢复模式。

2 个答案:

答案 0 :(得分:4)

来自Louis Davidson,Microsoft MVP:

  

没有办法插入   完全记录。 SELECT INTO是   最小化T-SQL中的日志记录的最佳方法,   使用SSIS你可以做同样的事情   使用批量插入进行光记录。

     

根据您的要求,我愿意   可能使用SSIS,全部丢弃   约束,特别是独特和   主键,加载数据,   添加约束。我加载   在短短一个多小时内就像100GB一样   这个,开销相当小。一世   我正在使用BULK LOGGED恢复模型,   这只记录了新的存在   记录期间的范围,然后   你可以稍后删除它们。

     

关键是从准系统开始   桌子,它只是尖叫。建造   索引一旦离开你就不会   索引维护,只有一个   每个索引的索引构建。

如果您不想使用SSIS,则该点仍然适用于删除所有约束并使用BULK LOGGED恢复模型。这大大减少了对INSERT INTO语句的日志记录,因此可以解决您的问题。

http://msdn.microsoft.com/en-us/library/ms191244.aspx

答案 1 :(得分:3)

将数据上传到tempdb而不是数据库,并在tempdb中执行所有中间转换。然后仅将最终数据复制到目标数据库中。使用批次可以最小化单个事务的大小。如果您仍有问题,请查看部署跟踪标记610,请参阅The Data Loading Performance GuidePrerequisites for Minimal Logging in Bulk Import

  

跟踪标志610

     

SQL Server 2008引入了跟踪标志   610,控制最小记录   插入到索引表中。