可能与此重复。我正在尝试从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万人的速度没有改善。这不是一个公式,但它是另一个可供您使用的数据点。