NPoco InsertBulk() 花了 45 *分钟* 插入 20,000 条记录
NPoco InsertBulk() took 45 *minutes* to insert 20,000 records
我正在开发当前使用 DataTables/DataAdapters 的 Winforms 应用程序,重点是将 importing/processing 分隔文本转换为嵌入式 SQL Server Compact 数据库。
它有效,但我并不热衷于在我的应用程序周围传递数据行而不是 POCO。我想我应该深入了解 ORM 的世界以进行比较。 NPoco 看起来不错,因为它明确支持 SQL Server Compact 和简单的语法。但是...
List<dummy> many = new List<dummy>(20000);
for (int i = 0; i < 20000; i++)
{
dummy newdummy = new dummy();
newdummy.dummytext = $"many-{i}";
many.Add(newdummy);
}
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.InsertBulk(many);
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
我被这速度之慢惊呆了! 45 分钟挂钟时间。 (获取 20,000 条记录的时间是可以接受的,但仍然...)
为了比较,我可以使用准备好的命令导入 20,000 多条记录,并在大约 2.5 秒内循环更新参数值。 DataAdapter.Update 是 8 秒。
ORM 是否不适合我的用例,或者我应该尝试不同的 ORM,还是...?
根据@John,此问题的解决方法是将批量插入包装在事务中。
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.BeginTransaction(); // <------
db.InsertBulk(many);
db.CompleteTransaction(); // <------
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
我正在开发当前使用 DataTables/DataAdapters 的 Winforms 应用程序,重点是将 importing/processing 分隔文本转换为嵌入式 SQL Server Compact 数据库。
它有效,但我并不热衷于在我的应用程序周围传递数据行而不是 POCO。我想我应该深入了解 ORM 的世界以进行比较。 NPoco 看起来不错,因为它明确支持 SQL Server Compact 和简单的语法。但是...
List<dummy> many = new List<dummy>(20000);
for (int i = 0; i < 20000; i++)
{
dummy newdummy = new dummy();
newdummy.dummytext = $"many-{i}";
many.Add(newdummy);
}
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.InsertBulk(many);
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
我被这速度之慢惊呆了! 45 分钟挂钟时间。 (获取 20,000 条记录的时间是可以接受的,但仍然...)
为了比较,我可以使用准备好的命令导入 20,000 多条记录,并在大约 2.5 秒内循环更新参数值。 DataAdapter.Update 是 8 秒。
ORM 是否不适合我的用例,或者我应该尝试不同的 ORM,还是...?
根据@John,此问题的解决方法是将批量插入包装在事务中。
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.BeginTransaction(); // <------
db.InsertBulk(many);
db.CompleteTransaction(); // <------
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}