加快了从C#向SQL Server中插入300万行的速度



可能与此重复。我正在尝试从BigQuery中检索数据,并尝试将其插入SQL Server中。我能够相对容易地从BigQuery中检索数据。但问题是,尽管有以下代码(灵感来自重复的问题(,即使有100K行,也需要97+秒才能将数据插入SQL Server!

using( var conn = new SqlConnection( dbConnString ) )
{
conn.Open();
try
{
using( var sqlBulkCopy = new SqlBulkCopy( conn, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null ) )
{
sqlBulkCopy.BulkCopyTimeout = 100;
sqlBulkCopy.DestinationTableName = table.TableName;
sw.Start(); //StopWatch
sqlBulkCopy.WriteToServer( table );
}
sw.Stop();
Console.WriteLine( $"Time taken to INSERT data: {sw.ElapsedMilliseconds}" );
}
catch( Exception ex )
{
Console.WriteLine( $"Error while inserting in to DB: {ex.Message}" );
}
}

默认情况下,SqlBulkCopy将在单个批处理中处理该操作。如果您有10万行要复制,则将同时复制10万行。

您应该指定BatchSize,在代码中添加以下行:

bulkCopy.BatchSize = 5000;

不指定BatchSize可能会影响您的应用程序:

  • 降低SqlBulkCopy性能
  • 增加获得超时过期异常的机会
  • 增加获得OutOfMemory异常的机会
  • 影响服务器性能
  • 影响数据库服务器性能

5000的批量大小是速度和内存消耗的最佳折衷。

有关更多详细信息,请查看以下问题:

SqlBulkCopy的建议批处理大小是多少?

在这里,为了完整性,我添加了最佳响应(在我看来(

我有一个导入实用程序,它位于与SQL server实例相同的物理服务器上。使用自定义IDataReader,它解析平面文件,并使用SQLBulkCopy将它们插入数据库。一个典型的文件有大约6M个合格的行,平均有5列十进制和短文本,每行大约30个字节。在这种情况下,我发现批量大小为5000是速度和内存消耗的最佳折衷方案。我从500开始,尝试更大的。我发现5000比500平均快2.5倍。在批处理大小为5000的情况下,插入600万行需要大约30秒,在批处理尺寸为500的情况下需要大约80秒。10000并没有明显加快。移动到50000将速度提高了几个百分点,但不值得增加服务器负载。超过5万人的速度没有改善。这不是一个公式,但它是另一个可供您使用的数据点。

最新更新