| Bug #105965 | performance issue when adding parameters to the para collection | ||
|---|---|---|---|
| Submitted: | 23 Dec 2021 2:58 | Modified: | 24 Dec 2021 13:52 |
| Reporter: | Zheyuan Lin | Email Updates: | |
| Status: | Won't fix | Impact on me: | |
| Category: | Connector / NET | Severity: | S5 (Performance) |
| Version: | 8.0.27 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[23 Dec 2021 2:58]
Zheyuan Lin
[23 Dec 2021 12:33]
MySQL Verification Team
Hello Zheyuan Lin, Thank you for the bug report. May I request you to please provide a simple test case(c# class) to reproduce this issue at our end? If you can provide more information, feel free to add it to this bug and change the status back to 'Open'. Regards, Ashwini Patil
[23 Dec 2021 15:25]
Zheyuan Lin
Test Code:
int paramCount = 50000;
var cmd = new MySqlCommand();
var sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < paramCount; i++)
{
IDbDataParameter p = cmd.CreateParameter();
p.ParameterName = $"?param_{i}";
p.DbType = DbType.String;
cmd.Parameters.Add(p);
}
Console.WriteLine(sw1.Elapsed);
var cmd2 = new MySqlCommand();
var sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < paramCount; i++)
{
IDbDataParameter p = cmd2.CreateParameter();
p.ParameterName = $"?param_{i}";
p.DbType = DbType.String;
cmd2.Parameters.AddWithValue(p.ParameterName, p);
}
Console.WriteLine(sw2.Elapsed);
[23 Dec 2021 15:38]
Zheyuan Lin
Use "Add(object)" And "Add(MySqlParameter)" make big different.
int paramCount = 50000;
var cmd = new MySqlCommand();
var sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < paramCount; i++)
{
IDbDataParameter p = cmd.CreateParameter();
p.ParameterName = $"?param_{i}";
p.DbType = DbType.String;
cmd.Parameters.Add(p);
}
Console.WriteLine(sw1.Elapsed);
var cmd2 = new MySqlCommand();
var sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < paramCount; i++)
{
MySqlParameter p = cmd2.CreateParameter();
p.ParameterName = $"?param_{i}";
p.DbType = DbType.String;
cmd2.Parameters.Add(p);
}
Console.WriteLine(sw2.Elapsed);
Just a example. I think it can help you find the issue.
[24 Dec 2021 13:21]
MySQL Verification Team
Hello Zheyuan Lin, Thank you for the requested details. Please note that MySqlParameterCollection.Add(String, Object) is obsolete since C/NET 8.0.14 and it is recommended and suggested to use MySqlParameterCollection.AddWithValue instead. For more info, please see https://dev.mysql.com/doc/relnotes/connector-net/en/news-8-0-14.html Regards, Ashwini Patil
[24 Dec 2021 13:52]
Zheyuan Lin
Please note that the issue cause by "Add( Object):int ",NOT "Add(String, Object):MySqlParameter " . THEY ARE DIFFERENT. THE VERSION IS "8.0.27", you can't find a method "MySqlParameterCollection.Add(String, Object) " IN this Version becasue it's obsolete. "Add( Object) :int" is inherited from DbParameterCollection.
[24 Dec 2021 18:51]
Bradley Grainger
This seems like an incomplete fix for bug #62653: the Add(object) overload still calls IndexOf, which results in quadratic behaviour: https://github.com/mysql/mysql-connector-net/blob/4306c8484ec74b3ee1c349847f66acabbce6d63c... The fix would be the same: remove the IndexOf call and return _items.Count - 1.
[29 Dec 2021 5:04]
MySQL Verification Team
Thank you Bradley, for the feedback. Bug #105997 has been handled now. regards, Umesh
