我的数据库中有表 A、B 和 C。我必须将A和B得到的结果放入表C中。
目前,我有一个 SP,它将 A 和 B 的结果返回到 C# 应用程序。该结果将使用“System.Data.SqlClient.SqlBulkCopy”复制到表 C 中。优点是在使用批量复制插入期间,不会创建日志文件。
我想通过处理 SP 本身的插入来避免这种额外的流量。但是,它不应该使用任何日志文件。有什么办法可以实现这个目标吗?
请分享您的想法。
数据量: 150,000
Database:SQL Server 2005
数据库处于完全恢复模式;它无法改变..是选择进入在这种情况下有用吗?
编辑:当我使用 System.Data.SqlClient.SqlBulkCopy 时,操作将在 3 分钟内完成;正常插入需要30分钟...这个特殊操作不需要恢复;但是数据库中的其他操作必须恢复 - 因此我无法更改整个数据库的恢复模式。
Thanks
Lijo
您可以使用SELECT INTO
与BULK_LOGGED
恢复模型,以便最大限度地减少写入事务日志的记录数量,如示例 B 中所述INTO 条款文档 (MSDN) http://msdn.microsoft.com/en-us/library/ms188029.aspx:
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY BULK_LOGGED;
GO
-- Put your SELECT INTO statement here
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY FULL;
这对于批量插入也是必需的如果您希望对事务日志的影响最小,如中所述优化批量导入性能 (MSDN) http://msdn.microsoft.com/en-us/library/ms190421.aspx:
对于完全恢复模式下的数据库,批量导入期间执行的所有行插入操作都会完全记录在事务日志中。对于大量数据导入,这可能会导致事务日志快速填满。对于大容量导入操作,最小日志记录比完整日志记录更有效,并且降低了大容量导入操作填满日志空间的可能性。要在通常使用完整恢复模式的数据库上最小化记录大容量导入操作,您可以首先将数据库切换到大容量日志恢复模式。批量导入数据后,将恢复模式切换回完整恢复模式。
(强调我的)
IE。如果您尚未将数据库恢复模式设置为BULK_LOGGED
在执行批量插入之前您目前也无法通过批量插入获得最小事务日志记录的好处因此事务日志不会成为您速度下降的根源。 (这SqlBulkCopy
类不会自动为您执行此操作或任何其他操作)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)