-
Notifications
You must be signed in to change notification settings - Fork 317
Description
Description
When inserting rows with ExecuteNonQuery() and placeholder parameters, performance
(measured as inserted parameters per second) with the Microsoft.Data.SqlClient v2.1.1
and System.Data.SqlClient providers is progressively impacted from about 50+ parameters
per statement, both for single rows and for multirow batches.
Inserting with 2048 parameters in the statement is up to 7 times slower than with
128 parameters.
The issue is not present when using the System.Data.Odbc provider (or non-SQL Server
providers & databases), and performance is up to 25 times slower (when using 2048 parameters
per statement) than with the ODBC provider.
I've tested with Windows 10, .NET5.0 and a local SQL Server 2019 database, varying the
number of columns from 1 to 1024, and number of rows in each batch from 1 to 1000.
Note: The 'waviness' at 1000 and 2000 parameters is just an effect of the 1000/1024 and 2000/2048
numbers being separated in the graph - see the write-up for details:
The target table is un-indexed and the inserts uses SQL-92 syntax:
INSERT INTO tablename (column-a, [column-b, ...])
VALUES (@r0_c0, [@r0_c1, ...]),
(@r1_c0, [@r1_c1, ...]),
...
While table valued parameters and bulk inserts don't have this issue, they won't
help when inserting a single or just a few very wide rows at a time, so it would be
really useful to have this addressed (or identify any gremlins on my part!)
Please see the full write-up with charts, tables, BenchmarkDotNet info etc. at:
https://github.com/KristianWedberg/sql-batch-insert-performance
Reproduce
Fully runnable source (using BenchmarkDotNet) and instructions at:
https://github.com/KristianWedberg/sql-batch-insert-performance
Expected behavior
Using more parameters (beyond 128) in an insert row or batch should increase throughput,
measured as the number of parameters inserted per second, just like it does with
System.Data.Odbc and other non-SqlClient providers.
Technical details
- Microsoft.Data.SqlClient Version="2.1.1"
- System.Data.Odbc Version="5.0.0"
- System.Data.SqlClient Version="4.8.2"
- OS=Windows 10.0.19042
- .NET Core SDK=5.0.103
