百万次插入:SqlBulkCopy 超时
本文关键字:插入 SqlBulkCopy 超时 百万 | 更新日期: 2023-09-27 18:33:40
我们已经有一个正在运行的系统来处理所有连接字符串(db2,oracle,MSServer(。
目前,我们正在使用ExecuteNonQuery()
进行一些插入。
我们希望通过使用 SqlBulkCopy()
而不是 ExecuteNonQuery()
来提高性能。我们有一些客户拥有超过 5000 万条记录。
我们不想使用 SSIS,因为我们的系统支持多个数据库。
我创建了一个示例项目来测试SqlBulkCopy()
的性能。我为 MSServer 创建了一个简单的读取和插入函数
这是小函数:
public void insertIntoSQLServer()
{
using (SqlConnection SourceConnection = new SqlConnection(_sourceConnectionString))
{
//Open the connection to get the data from the source table
SourceConnection.Open();
using (SqlCommand command = new SqlCommand("select * from " + _sourceSchemaName + "." + _sourceTableName + ";", SourceConnection))
{
//Read from the source table
command.CommandTimeout = 2400;
SqlDataReader reader = command.ExecuteReader();
using (SqlConnection DestinationConnection = new SqlConnection(_destinationConnectionString))
{
DestinationConnection.Open();
//Clean the destination table
new SqlCommand("delete from " + _destinationSchemaName + "." + _destinationTableName + ";", DestinationConnection).ExecuteNonQuery();
using (SqlBulkCopy bc = new SqlBulkCopy(DestinationConnection))
{
bc.DestinationTableName = string.Format("[{0}].[{1}]", _destinationSchemaName, _destinationTableName);
bc.NotifyAfter = 10000;
//bc.SqlRowsCopied += bc_SqlRowsCopied;
bc.WriteToServer(reader);
}
}
}
}
}
当我的虚拟表中少于 200 000 时,批量副本工作正常。但是,当它超过 200 000 条记录时,我有以下错误:
- 尝试对具有挂起操作的对象调用大容量复制。
或
- 等待操作超时(对于 IDataReader(
我为读者增加了命令超时。似乎它已经解决了与IDataReader相关的超时问题。
我在代码中做错了什么吗?
你能尝试在调用 WriteToServer 之前添加以下内容吗?
bc.BatchSize = 10000;
bc.BulkCopyTimeout = 0;
我不知道默认的批量大小或超时是多少,但我怀疑这可能是您的问题。希望有帮助
此外,您可以尝试使用不同的批量大小以获得最佳性能。
你可以试试这个
bc.BatchSize = 100000; // How many Rows you want to insert at a time
bc.BulkCopyTimeout = 60; // Time in Seconds. If you want infinite waiting Time then assign 0.