我想用
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 之类的值应该会更快。
我遇到了 SqlBulkCopy 超时问题。使用 VarChar/NVarChar 时,性能会显着降低。我将数据类型更改为文本,它立即得到处理。具体来说,我有一个包含两个字段的记录,即 VarChar(999)。我将这些字段的数据类型更改为文本,并插入了包含这两个字段的记录,每个字段包含 100,000 个字符。我不确定为什么文本数据类型有助于提高性能?我怀疑这与 SQL Server 在内存中存储文本的方式有关。