首页 > 解决方案 > 在大量 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();
            }
        }
    }
}

标签: c#sqlsql-serversqlbulkcopy

解决方案


使用选项 SqlBulkCopyOptions.TableLock 将提高性能。

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.TableLock))
{
    // ...code...
}

使用 BatchSize 也会提高性能。您目前尝试一次插入 800,000 个整体,这太过分了。将其设置为 10k 之类的应该会使其更快。


推荐阅读