Skip to content

Commit 56285ab

Browse files
author
fabien.menager
committed
Update bulk insert benchmarks and improve SQL Server transaction handling
1 parent fbd395f commit 56285ab

3 files changed

Lines changed: 8 additions & 4 deletions

File tree

EntityFrameworkCore.ExecuteInsert.Benchmark/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class Program
66
{
77
public static void Main(string[] args)
88
{
9-
BenchmarkRunner.Run<BulkInsertVsExecuteInsert>();
9+
BenchmarkRunner.Run<BulkInsertVsExecuteInsertPostgreSql>();
1010
BenchmarkRunner.Run<BulkInsertVsExecuteInsertSqlServer>();
1111
}
1212
}

src/EntityFrameworkCore.ExecuteInsert.SqlServer/SqlServerBulkInsertProvider.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ protected override string GetTempTableName<T>(string tableName) where T : class
2828
protected override async Task BulkImport<T>(DbContext context, DbConnection connection, IEnumerable<T> entities, string tableName,
2929
PropertyAccessor[] properties, CancellationToken ctk)
3030
{
31-
using var bulkCopy = new SqlBulkCopy(connection as SqlConnection);
31+
await using var t = (SqlTransaction) await connection.BeginTransactionAsync(ctk); // TODO option
32+
33+
using var bulkCopy = new SqlBulkCopy(connection as SqlConnection, SqlBulkCopyOptions.TableLock, t);
3234
bulkCopy.DestinationTableName = tableName;
33-
bulkCopy.BatchSize = 10_000;
35+
bulkCopy.BatchSize = 50_000; // TODO option
3436
bulkCopy.BulkCopyTimeout = 60;
3537

3638
foreach (var prop in properties)
@@ -39,6 +41,8 @@ protected override async Task BulkImport<T>(DbContext context, DbConnection conn
3941
}
4042

4143
await bulkCopy.WriteToServerAsync(new EnumerableDataReader<T>(entities, properties), ctk);
44+
45+
await t.CommitAsync(ctk);
4246
}
4347

4448
protected override string BuildInsertSelectQuery(string tempTableName, string targetTableName,

tests/EntityFrameworkCore.ExecuteInsert.Tests/Tests/BulkInsertProviderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public async Task DoesNothingWhenEntitiesAreEmpty()
8080
public async Task InsertsThousandsOfEntitiesSuccessfully()
8181
{
8282
// Arrange
83-
const int count = 1_00_000;
83+
const int count = 1_000_000;
8484
var entities = Enumerable.Range(1, count).Select(i => new TestEntity
8585
{
8686
Id = i,

0 commit comments

Comments
 (0)