提高 SqlBulkCopy 在大量 nvarchar(max) 上的性能

问题描述 投票:0回答:2

我想用

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# sql sql-server sqlbulkcopy
2个回答
0
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.