gpt4 book ai didi

c# - 从存储过程批量复制

转载 作者:行者123 更新时间:2023-11-30 18:03:46 24 4
gpt4 key购买 nike

我在数据库中有表 A、B 和 C。我要把A和B得到的结果放到C表中。

目前,我有一个 SP 将 A 和 B 的结果返回给 C# 应用程序。此结果将使用“System.Data.SqlClient.SqlBulkCopy”复制到表 C 中。优点是在使用 bulkcopy 插入期间,不会创建日志文件。

我想通过在 SP 本身中处理插入来避免这种额外的流量。但是,它不应使用任何日志文件。有什么办法可以实现吗?

请分享您的想法。

数据量:150,000

数据库:SQL Server 2005

数据库处于完全恢复模式;它无法更改。SELECT INTO 在这种情况下有用吗?

编辑:当我使用 System.Data.SqlClient.SqlBulkCopy 时,操作在 3 分钟内完成;在正常插入中需要 30 分钟...不需要恢复此特定操作;但是必须恢复数据库中的其他操作 - 因此我无法更改整个数据库的恢复模式。

谢谢

李乔

最佳答案

您可以将SELECT INTOBULK_LOGGED 恢复模型一起使用,以尽可能减少写入事务日志的记录数,如INTO Clause documentation (MSDN) 的示例B 中所述。 :

ALTER DATABASE AdventureWorks2008R2 SET RECOVERY BULK_LOGGED;
GO
-- Put your SELECT INTO statement here
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY FULL;

这也是批量插入所必需的,如果您希望对事务日志的影响最小,如 Optimizing Bulk Import Performance (MSDN) 中所述:

For a database under the full recovery model, all row-insert operations that are performed during bulk import are fully logged in the transaction log. For large data imports, this can cause the transaction log to fill rapidly. For bulk-import operations, minimal logging is more efficient than full logging and reduces the possibility that a bulk-import operation will fill the log space. To minimally log a bulk-import operation on a database that normally uses the full recovery model, you can first switch the database to the bulk-logged recovery model. After bulk importing the data, switch the recovery model back to the full recovery model.

(强调我的)

即如果您在执行批量插入之前尚未将数据库恢复模型设置为 BULK_LOGGED,那么您目前也无法通过批量插入获得最少事务日志记录的好处因此事务日志不会成为您减速的根源。 (SqlBulkCopy 类不会自动为您执行此操作或做任何事情)

关于c# - 从存储过程批量复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6855871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com