【问题标题】:NPoco InsertBulk() took 45 *minutes* to insert 20,000 recordsNPoco InsertBulk() 花了 45 *分钟* 插入 20,000 条记录
【发布时间】:2017-07-23 23:49:48
【问题描述】:

我正在开发一个 Winforms 应用程序,该应用程序当前使用 DataTables/DataAdapters,重点是将分隔文本导入/处理到嵌入式 SQL Server Compact 数据库中。

它有效,但我并不热衷于在我的应用程序中传递 DataRows 而不是 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 条记录的获取时间是可以接受的,但仍然......)

作为比较,我可以在大约 2.5 秒内使用准备好的命令导入 20,000 多条记录并在循环中更新参数值。 DataAdapter.Update 为 8 秒。

ORM 是否不适合我的用例,或者我应该尝试不同的 ORM,还是...?

【问题讨论】:

  • 您可以使用 orm,但它需要 explicit 支持批量操作。实体框架可以借助其他库。在内部,NPoco 使用 SqlBulkCopy。您的问题不在于库:sqlce 不支持批量操作。
  • 遗憾的是,NPoco 上唯一真正的批量插入实现是针对 SqlServer 的。甚至它也没有以最好的方式实现 - 它首先将 pocos 转换为...数据表:(
  • 对 ORM 没有意见,但如果您正在寻找一种轻松快速地批量插入 SqlCE 数据库的方法,请使用使用 CommandType.TableDirect 从 SqlCeCommand 准备的 SqlCeResultSet。
  • SqlCE 支持事务吗?您可以对交易进行相同的测试吗? NPoco Transactions
  • @John : db.BeginTransaction(); db.InsertBulk(many); db.CompleteTransaction(); 将其缩短到 4 。我想我可以忍受。 @TnTinMn 的建议不到 1 秒。

标签: c# winforms bulkinsert npoco


【解决方案1】:

根据@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());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多