EntityFrameworkCore.PostgreSQL.SimpleBulks

December 2, 2025 · View on GitHub

A very simple .net core library that can help to sync a large number of records in-memory into the database using the COPY FROM STDIN command.  

Overview

This library provides extension methods so that you can use with your EntityFrameworkCore DbContext instance DbContextExtensions.cs or you can use ConnectionContextExtensions.cs to work directly with a NpgsqlConnection instance without using EntityFrameworkCore.

Nuget

DatabasePackageGitHub
SQL ServerEntityFrameworkCore.SqlServer.SimpleBulksEntityFrameworkCore.SqlServer.SimpleBulks
PostgreSQLEntityFrameworkCore.PostgreSQL.SimpleBulksEntityFrameworkCore.PostgreSQL.SimpleBulks
MySQLEntityFrameworkCore.MySQL.SimpleBulksEntityFrameworkCore.MySQL.SimpleBulks

Features

  • Bulk Insert (requires PostgreSQL >= 17)
  • Bulk Update
  • Bulk Delete
  • Bulk Merge (requires PostgreSQL >= 17)
  • Bulk Match
  • Temp Table
  • Direct Insert
  • Direct Update
  • Direct Delete
  • Upsert

Examples

DbContextExtensionsExamples

  • Update the connection string ConnectionStrings.PostgreSQLConnectionString.
  • Build and run.

ConnectionExtensionsExamples

  • Update the connection string ConnectionStrings.PostgreSQLConnectionString.
  • Build and run.

DbContextExtensions

Using Lambda Expression

using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkDelete;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkInsert;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkMerge;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkUpdate;

// Insert all columns
await dbct.BulkInsertAsync(rows);
await dbct.BulkInsertAsync(compositeKeyRows);

// Insert selected columns only
await dbct.BulkInsertAsync(rows,
    row => new { row.Column1, row.Column2, row.Column3 });
await dbct.BulkInsertAsync(compositeKeyRows,
    row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });

await dbct.BulkUpdateAsync(rows,
    row => new { row.Column3, row.Column2 });
await dbct.BulkUpdateAsync(compositeKeyRows,
    row => new { row.Column3, row.Column2 });

await dbct.BulkMergeAsync(rows,
    row => row.Id,
    row => new { row.Column1, row.Column2 },
    row => new { row.Column1, row.Column2, row.Column3 });
await dbct.BulkMergeAsync(compositeKeyRows,
    row => new { row.Id1, row.Id2 },
    row => new { row.Column1, row.Column2, row.Column3 },
    row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
                        
await dbct.BulkDeleteAsync(rows);
await dbct.BulkDeleteAsync(compositeKeyRows);

Using Dynamic String

using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkDelete;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkInsert;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkMerge;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkUpdate;

await dbct.BulkUpdateAsync(rows,
    [ "Column3", "Column2" ]);
await dbct.BulkUpdateAsync(compositeKeyRows,
    [ "Column3", "Column2" ]);

await dbct.BulkMergeAsync(rows,
    ["Id"],
    [ "Column1", "Column2" ],
    [ "Column1", "Column2", "Column3" ]);
await dbct.BulkMergeAsync(compositeKeyRows,
    [ "Id1", "Id2" ],
    [ "Column1", "Column2", "Column3" ],
    [ "Id1", "Id2", "Column1", "Column2", "Column3" ]);

Using Builder Approach in case you need both Dynamic & Lambda Expression

await dbct.CreateBulkInsertBuilder<Row>()
	.WithColumns(row => new { row.Column1, row.Column2, row.Column3 })
	// or .WithColumns([ "Column1", "Column2", "Column3" ])
	.ToTable(dbContext.GetTableInfor<Row>())
	.ExecuteAsync(rows);

ConnectionContextExtensions

Using Lambda Expression

using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkDelete;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkInsert;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkMerge;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkUpdate;

// Configure Mapping globaly

TableMapper.Configure<Row>(config =>
{
    config
    .TableName("Rows")
    .PrimaryKeys(x => x.Id)
    .OutputId(x => x.Id, OutputIdMode.ServerGenerated);
});

TableMapper.Configure<CompositeKeyRow>(config =>
{
    config
    .TableName("CompositeKeyRows")
    .PrimaryKeys(x => new { x.Id1, x.Id2 });
});

var connection = new ConnectionContext(new NpgsqlConnection(connectionString), null);

// Insert all columns
await connection.BulkInsertAsync(rows);
await connection.BulkInsertAsync(compositeKeyRows);

// Insert selected columns only
await connection.BulkInsertAsync(rows,
    row => new { row.Column1, row.Column2, row.Column3 });
await connection.BulkInsertAsync(compositeKeyRows,
    row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });

await connection.BulkUpdateAsync(rows,
    row => new { row.Column3, row.Column2 });
await connection.BulkUpdateAsync(compositeKeyRows,
    row => new { row.Column3, row.Column2 });

await connection.BulkMergeAsync(rows,
    row => row.Id,
    row => new { row.Column1, row.Column2 },
    row => new { row.Column1, row.Column2, row.Column3 });
await connection.BulkMergeAsync(compositeKeyRows,
    row => new { row.Id1, row.Id2 },
    row => new { row.Column1, row.Column2, row.Column3 },
    row => new { row.Id1, row.Id2, row.Column1, row.Column2, row.Column3 });
                        
await connection.BulkDeleteAsync(rows);
await connection.BulkDeleteAsync(compositeKeyRows);

Using Dynamic String

using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkDelete;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkInsert;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkMerge;
using EntityFrameworkCore.PostgreSQL.SimpleBulks.BulkUpdate;

var connection = new ConnectionContext(new NpgsqlConnection(connectionString), null);

await connection.BulkInsertAsync(rows,
    [ "Column1", "Column2", "Column3" ]);
await connection.BulkInsertAsync(compositeKeyRows,
    [ "Id1", "Id2", "Column1", "Column2", "Column3" ]);

await connection.BulkUpdateAsync(rows,
    [ "Column3", "Column2" ]);
await connection.BulkUpdateAsync(compositeKeyRows,
    [ "Column3", "Column2" ]);

await connection.BulkMergeAsync(rows,
    ["Id"],
    [ "Column1", "Column2" ],
    [ "Column1", "Column2", "Column3" ]);
await connection.BulkMergeAsync(compositeKeyRows,
    [ "Id1", "Id2" ],
    [ "Column1", "Column2", "Column3" ],
    [ "Id1", "Id2", "Column1", "Column2", "Column3" ]);

Using Builder Approach in case you need both Dynamic & Lambda Expression

await connection.CreateBulkInsertBuilder<Row>()
	.WithColumns(row => new { row.Column1, row.Column2, row.Column3 })
	// or .WithColumns([ "Column1", "Column2", "Column3" ])
	.ToTable(new NpgsqlTableInfor<Row>("Rows"))
	.ExecuteAsync(rows);

Execution Options

BulkInsert

await _context.BulkInsertAsync(rows,
    row => new { row.Column1, row.Column2, row.Column3 },
    new BulkInsertOptions
    {
        KeepIdentity = false,
        BatchSize = 0,
        Timeout = 30,
        LogTo = Console.WriteLine
    });

BulkUpdate

await _context.BulkUpdateAsync(rows,
    row => new { row.Column3, row.Column2 },
    new BulkUpdateOptions
    {
        BatchSize = 0,
        Timeout = 30,
        LogTo = Console.WriteLine
    });

BulkDelete

await _context.BulkDeleteAsync(rows,
    new BulkDeleteOptions
    {
        BatchSize = 0,
        Timeout = 30,
        LogTo = Console.WriteLine
    });

BulkMerge

await _context.BulkMergeAsync(rows,
    row => row.Id,
    row => new { row.Column1, row.Column2 },
    row => new { row.Column1, row.Column2, row.Column3 },
    new BulkMergeOptions
    {
        BatchSize = 0,
        Timeout = 30,
        ReturnDbGeneratedId = true,
        LogTo = Console.WriteLine
    });

BulkMatch

var contactsFromDb = await _context.BulkMatchAsync(matchedContacts,
    x => new { x.CustomerId, x.CountryIsoCode },
    new BulkMatchOptions
    {
        BatchSize = 0,
        Timeout = 30,
        LogTo = Console.WriteLine
    });

TempTable

var customerTableName = await _context.CreateTempTableAsync(customers,
    x => new
    {
        x.IdNumber,
        x.FirstName,
        x.LastName,
        x.CurrentCountryIsoCode
    },
    new TempTableOptions
    {
        BatchSize = 0,
        Timeout = 30,
        LogTo = Console.WriteLine
    });

DirectInsert

await _context.DirectInsertAsync(row,
    row => new { row.Column1, row.Column2, row.Column3 },
    new BulkInsertOptions
    {
        Timeout = 30,
        LogTo = Console.WriteLine
    });

DirectUpdate

await _context.DirectUpdateAsync(row,
    row => new { row.Column3, row.Column2 },
    new BulkUpdateOptions
    {
        Timeout = 30,
        LogTo = Console.WriteLine
    });

DirectDelete

await _context.DirectDeleteAsync(row,
    new BulkDeleteOptions
    {
        Timeout = 30,
        LogTo = Console.WriteLine
    });

Upsert

await _context.UpsertAsync(row,
    row => row.Id,
    row => new { row.Column1, row.Column2 },
    row => new { row.Column1, row.Column2, row.Column3 },
    new BulkMergeOptions
    {
        Timeout = 30,
        ReturnDbGeneratedId = true,
        LogTo = Console.WriteLine
    });

Returned Result

BulkUpdate

var updateResult = await dbct.BulkUpdateAsync(rows, row => new { row.Column3, row.Column2 });

Console.WriteLine($"Updated: {updateResult.AffectedRows} row(s)");

BulkDelete

var deleteResult = await dbct.BulkDeleteAsync(rows);

Console.WriteLine($"Deleted: {deleteResult.AffectedRows} row(s)");

BulkMerge

var mergeResult = await dbct.BulkMergeAsync(rows,
    row => row.Id,
    row => new { row.Column1, row.Column2 },
    row => new { row.Column1, row.Column2, row.Column3 });

Console.WriteLine($"Updated: {mergeResult.UpdatedRows} row(s)");
Console.WriteLine($"Inserted: {mergeResult.InsertedRows} row(s)");
Console.WriteLine($"Affected: {mergeResult.AffectedRows} row(s)");

Benchmarks

BulkInsert

Single Table /src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkInsertSingleTableBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-VUKETC : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Gen2Allocated
EFCoreInsert10024.87 msNA---1117.16 KB
BulkInsert10016.19 msNA---144.4 KB
EFCoreInsert1000116.08 msNA1000.00001000.0000-10733.77 KB
BulkInsert100026.10 msNA---909.45 KB
EFCoreInsert100001,032.25 msNA14000.00006000.0000-101319.22 KB
BulkInsert10000158.03 msNA1000.00001000.0000-8484.25 KB
EFCoreInsert1000006,424.85 msNA138000.000050000.0000-997459.33 KB
BulkInsert100000851.58 msNA12000.00002000.00001000.000078651.35 KB
EFCoreInsert25000015,169.42 msNA346000.0000121000.0000-2469857.71 KB
BulkInsert2500002,049.98 msNA28000.00001000.0000-193035.99 KB
EFCoreInsert50000034,492.82 msNA693000.0000240000.0000-4946532.22 KB
BulkInsert5000003,977.10 msNA57000.00002000.0000-387290.34 KB

Multiple Tables (1x parent rows + 5x child rows) /src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkInsertMultipleTablesBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-LTFAOU : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Gen2Allocated
EFCoreInsert100145.08 msNA1000.00001000.0000-8343.67 KB
BulkInsert10049.57 msNA---665.8 KB
EFCoreInsert1000795.13 msNA11000.00005000.0000-78542.85 KB
BulkInsert1000188.83 msNA---5941.84 KB
EFCoreInsert100006,722.98 msNA109000.000041000.0000-772122.11 KB
BulkInsert100001,302.40 msNA9000.00002000.00001000.000055370.05 KB
EFCoreInsert10000061,476.01 msNA1087000.0000373000.0000-7687142.55 KB
BulkInsert10000012,805.28 msNA82000.00004000.0000-548065.25 KB

BulkUpdate

/src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkUpdateBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
EFCoreUpdate10026.56 msNA--1056.89 KB
BulkUpdate10020.16 msNA--53.34 KB
EFCoreUpdate1000118.31 msNA1000.00001000.00008172.52 KB
BulkUpdate100029.87 msNA--415.93 KB
EFCoreUpdate100001,000.87 msNA10000.00003000.000075273.42 KB
BulkUpdate10000175.40 msNA--4012.16 KB
EFCoreUpdate1000007,526.76 msNA104000.000028000.0000735520.32 KB
BulkUpdate1000001,395.47 msNA6000.00001000.000038947.02 KB
EFCoreUpdate25000018,029.63 msNA260000.000070000.00001818097.27 KB
BulkUpdate2500004,606.96 msNA15000.00003000.000097174.13 KB

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-FVGKFX : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
BulkUpdate50000014.99 sNA31000.00006000.0000189.67 MB
BulkUpdate100000052.35 sNA63000.000013000.0000379.21 MB

BulkDelete

/src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkDeleteBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
EFCoreDelete10018.97 msNA--675.7 KB
BulkDelete10016.18 msNA--25.73 KB
EFCoreDelete1000127.17 msNA1000.00001000.00006448.29 KB
BulkDelete100041.02 msNA--166.36 KB
EFCoreDelete10000941.10 msNA9000.00002000.000061677.63 KB
BulkDelete10000209.25 msNA--1572.33 KB
EFCoreDelete200002,188.30 msNA17000.00006000.0000122600.81 KB
BulkDelete20000324.00 msNA--3135.3 KB
EFCoreDelete500003,430.29 msNA43000.000011000.0000301041.3 KB
BulkDelete50000756.71 msNA1000.0000-7822.52 KB

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-RRDFUF : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
BulkDelete1000002.108 sNA2000.00001000.000015.27 MB
BulkDelete2500003.905 sNA6000.00001000.000038.16 MB
BulkDelete5000007.768 sNA12000.00001000.000076.3 MB
BulkDelete100000015.895 sNA25000.00001000.0000152.6 MB

BulkMerge

/src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkMergeBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
EFCoreUpsert10039.72 msNA--2138.82 KB
BulkMerge10031.75 msNA--201.27 KB
EFCoreUpsert1000446.34 msNA2000.00001000.000018676.95 KB
BulkMerge100060.98 msNA--1821.43 KB
EFCoreUpsert100002,293.35 msNA24000.000010000.0000175741.33 KB
BulkMerge10000315.95 msNA2000.00001000.000017002.34 KB
EFCoreUpsert10000014,094.90 msNA243000.000075000.00001735002.65 KB
BulkMerge1000001,933.37 msNA26000.00001000.0000168875.89 KB
EFCoreUpsert25000034,470.08 msNA607000.0000190000.00004292407.68 KB
BulkMerge2500005,091.40 msNA64000.00003000.0000418668.28 KB

/src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkMergeReturnDbGeneratedIdBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
ReturnDbGeneratedId10015.65 msNA--189.59 KB
NotReturnDbGeneratedId10020.96 msNA--148.23 KB
ReturnDbGeneratedId100047.67 msNA--1707.91 KB
NotReturnDbGeneratedId100049.77 msNA--1301.91 KB
ReturnDbGeneratedId10000234.40 msNA2000.00001000.000015867.1 KB
NotReturnDbGeneratedId10000441.70 msNA1000.0000-11897.58 KB
ReturnDbGeneratedId1000002,330.98 msNA24000.00001000.0000157522.2 KB
NotReturnDbGeneratedId1000001,674.64 msNA19000.00001000.0000118806.84 KB

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-FVGKFX : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
ReturnDbGeneratedId2500005.101 sNA60000.00001000.0000381.14 MB
NotReturnDbGeneratedId2500004.681 sNA48000.00001000.0000290.02 MB
ReturnDbGeneratedId50000010.377 sNA121000.00003000.0000763.73 MB
NotReturnDbGeneratedId5000009.393 sNA96000.00001000.0000580.01 MB
ReturnDbGeneratedId100000021.818 sNA243000.00006000.00001529.56 MB
NotReturnDbGeneratedId100000022.181 sNA193000.00002000.00001160.27 MB

BulkMatch

Single Column /src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkMatchSingleColumnBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Gen2Allocated
EFCoreSelect100107.695 msNA---765.44 KB
EFCoreBatchSelect1003.477 msNA---60.54 KB
BulkMatch1008.764 msNA---85.45 KB
EFCoreSelect1000862.412 msNA1000.0000--7361.88 KB
EFCoreBatchSelect10006.029 msNA---511.2 KB
BulkMatch100012.584 msNA---740.02 KB
EFCoreSelect100008,139.137 msNA11000.00001000.0000-70483.66 KB
EFCoreBatchSelect1000034.499 msNA---5127.73 KB
BulkMatch1000059.851 msNA1000.0000--7522.84 KB
EFCoreSelect10000074,961.618 msNA115000.000024000.00001000.0000705096.2 KB
EFCoreBatchSelect100000526.386 msNA7000.00002000.0000-51371.59 KB
BulkMatch100000376.410 msNA11000.00004000.0000-71420.53 KB

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-FVGKFX : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Gen2Allocated
EFCoreBatchSelect250000912.3 msNA16000.00008000.0000-112.49 MB
BulkMatch2500001,010.1 msNA29000.00009000.00001000.0000173.6 MB
EFCoreBatchSelect5000001,516.4 msNA34000.000017000.00001000.0000224.89 MB
BulkMatch5000002,572.8 msNA57000.000017000.00001000.0000347.35 MB
EFCoreBatchSelect10000003,360.8 msNA68000.000034000.00001000.0000449.7 MB
BulkMatch10000003,810.3 msNA113000.000032000.00001000.0000694.86 MB

Multiple Columns /src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/BulkMatchMultipleColumnsBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
EFCoreSelect100104.54 msNA--987.75 KB
BulkMatch10011.92 msNA--154.95 KB
EFCoreSelect10001,129.42 msNA1000.0000-9372.7 KB
BulkMatch100026.21 msNA--1342.45 KB
EFCoreSelect100008,849.80 msNA14000.00003000.000091054.35 KB
BulkMatch10000133.98 msNA2000.00001000.000013648.6 KB
EFCoreSelect10000079,089.28 msNA148000.000038000.0000910681.02 KB
BulkMatch100000770.69 msNA20000.00005000.0000129760.33 KB

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-FVGKFX : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Allocated
BulkMatch2500003.090 sNA51000.000013000.0000318.85 MB
BulkMatch5000004.753 sNA104000.000027000.0000640.03 MB
BulkMatch10000009.823 sNA209000.000054000.00001282.65 MB

TempTable

/src/EntityFrameworkCore.PostgreSQL.SimpleBulks.Benchmarks/TempTableBenchmarks.cs


BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.5011)
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=8.0.400
  [Host]     : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2
  Job-SKLMHH : .NET 8.0.8 (8.0.824.36612), X64 RyuJIT AVX2

InvocationCount=1  IterationCount=1  UnrollFactor=1  
WarmupCount=0  

MethodRowsCountMeanErrorGen0Gen1Gen2Allocated
CreateTempTable10011.01 msNA---120.83 KB
CreateTempTable100022.78 msNA---732.55 KB
CreateTempTable10000106.20 msNA1000.00001000.0000-6851.52 KB
CreateTempTable100000335.78 msNA12000.00002000.00001000.000068058.16 KB
CreateTempTable250000823.61 msNA27000.00001000.0000-170011.08 KB
CreateTempTable5000001,586.69 msNA55000.00001000.0000-339932.95 KB
CreateTempTable10000003,280.07 msNA110000.00001000.0000-679776.7 KB

License

EntityFrameworkCore.PostgreSQL.SimpleBulks is licensed under the MIT license.