c# - 在大量 nvarchar(max) 上提高 SqlBulkCopy 性能
问题描述
我想在两个表之间复制数据SqlBulkCopy
。所以首先我在我的表中定义了一个包含 where 子句(where ID IN (...))的语句,它定义了应该复制哪些条目。(在这种情况下,结果集中大约有 800,000 个条目。)
我的问题是这个复制过程需要很长时间才能完成,我想优化它。我猜想存储在 nvarchar(max) 列中的大量字符串数据会导致长期运行。
有什么可以改进的地方来优化执行时间。
我的代码如下所示:
using (SqlConnection source = source_connection)
{
source.Open();
SqlCommand source_command = source.CreateCommand();
source_command.CommandText = source_command_select_text;
source_command.CommandTimeout = 1200;
SqlDataReader reader = source_command.ExecuteReader();
using (SqlConnection destination = destination_connection)
{
destination.Open();
using (SqlBulkCopy bulkCopy = new(destination))
{
bulkCopy.DestinationTableName = destination_table;
bulkCopy.BulkCopyTimeout = 1200;
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Log.Logger.Error(ex.ToString());
throw;
}
finally
{
reader.Close();
}
}
}
}
解决方案
使用选项 SqlBulkCopyOptions.TableLock 将提高性能。
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.TableLock))
{
// ...code...
}
使用 BatchSize 也会提高性能。您目前尝试一次插入 800,000 个整体,这太过分了。将其设置为 10k 之类的应该会使其更快。