Sql 最小登录插入

Sql 最小登录插入,sql,sql-server-2008,logging,insert,bulkinsert,Sql,Sql Server 2008,Logging,Insert,Bulkinsert,我有一个INSERT语句,它占用了大量的日志空间,以至于在语句完成之前硬盘实际上已经满了 问题是,我真的不需要记录,因为这只是一个中间的数据上传步骤 为了论证起见,假设我有: 表A:初始上载表(使用bcp填充,因此没有日志记录问题) 表B:使用从A插入B的填充 有没有一种方法可以在a和B之间进行复制,而无需将任何内容写入日志 另一方面,我正在使用SQL Server 2008与简单恢复模型一起使用。来自微软MVP Louis Davidson: 如果没有,就无法插入 根本不需要日志记录。选择

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

问题是,我真的不需要记录,因为这只是一个中间的数据上传步骤

为了论证起见,假设我有:

  • 表A:初始上载表(使用
    bcp
    填充,因此没有日志记录问题)
  • 表B:使用从A插入B的
    填充
有没有一种方法可以在a和B之间进行复制,而无需将任何内容写入日志


另一方面,我正在使用SQL Server 2008与简单恢复模型一起使用。

来自微软MVP Louis Davidson:

如果没有,就无法插入 根本不需要日志记录。选择进入是 减少T-SQL中日志记录的最佳方法, 使用SSI,您可以执行同样的操作 使用批量插入的光记录

根据你的要求,我会 可能使用SSI,删除所有 约束,特别是唯一的和 主键,加载数据, 重新添加约束。我装载 大约100GB只需一个多小时,就像 这是一种非常简单的方法,开销非常小。我 我使用大容量日志恢复模型, 这只是记录了新的存在 记录期间的扩展数据块,然后 您可以稍后删除它们

关键是从赤裸裸开始 桌子,它只是尖叫。建筑 索引一旦离开,您将不会 要维护的索引,只有一个 每个索引的索引构建

如果您不想使用SSI,这一点仍然适用于删除所有约束,并使用
批量记录的
恢复模型。这大大减少了在
INSERT-INTO
语句中进行的日志记录,因此应该可以解决您的问题


将数据上传到tempdb而不是数据库,并在tempdb中执行所有中间转换。然后仅将最终数据复制到目标数据库中。使用批处理最小化单个事务大小。如果仍然存在问题,请查看部署跟踪标志610,请参阅和:

跟踪标志610

SQL Server 2008引入跟踪标志 610,它控制最少的日志记录 插入到索引表中


我在这些表上有一个PK和一个相当多的索引,以及一些默认值。我可以删除和创建PK和索引,但我需要在测试期间使用默认值INSERT@Karl-那好吧。这会减慢插入速度,但主要问题是日志大小,这将通过
批量记录
恢复模型解决。速度提升主要只是一种奖励。您需要查看以确保插入的记录不会导致触发,因为即使在
大容量记录的恢复模式中,这也可能会增加日志文件,我相信。使用标志610难道不允许我们以最少的日志记录将..插入?@MohammadSanati-不在这种情况下。该表有一个PK,因此此语句适用:“如果一个表有聚集索引且非空,则无论恢复模式如何,数据页和索引页都将被完全记录”。这是来自使用标志610的页面:。可能会有这样一个参数,即开始时为空,但如果插入是成批进行的,或者已经存在数据,则日志会爆炸。