【问题标题】:What does ExecuteNonQuery() do during a bulk insert?ExecuteNonQuery() 在批量插入期间做了什么?
【发布时间】:2016-10-17 05:04:26
【问题描述】:

我有一些我写的批量插入 vb.net 代码(工作)。它为每个插入调用 ExecuteNonQuery(),然后在最后执行 commit()。

我的问题是在等待 commit() 命令时这些插入的位置?我还没有对支持批处理进行任何更改。因此,在调用 commit() 之前,将使用我现有的代码插入一百万行。我问这个问题显然是想知道我是否会遇到内存问题,因此迫使我现在对我的代码进行更改。

【问题讨论】:

  • ExecuteNonQuery() 将返回受影响的行数。是否可以包含您当前正在使用的示例 sn-ps,然后您会得到更好的答案?
  • 它们没有放在任何地方。他们被处决。您可能不会有内存问题,但最简单的方法就是这样做。编写这个 10 行程序并运行它来测试它需要多长时间?
  • 这是我在使用 google 时遇到的一些随机互联网人的一篇小博客文章,您可能想阅读:jokecamp.com/blog/make-your-sqlite-bulk-inserts-very-fast-in-c
  • 这可能会回答你的问题stackoverflow.com/questions/15795259/…
  • @pnizzle 抱歉,我不是说你的整个程序只有 10 行,但你需要测试的重要代码是。实际上,如果您在我提供的链接中使用相同的代码,如果您不计算他用于基准测试结果的行数,则为 9 行。

标签: vb.net sqlite bulkinsert executenonquery


【解决方案1】:

在普通的rollback journal mode 中,更改只是简单地写入数据库。但是,为了允许atomic commits,所有更改的数据库页面的先前内容都将写入回滚日志,以便回滚可以恢复之前的状态。 (当您插入太多需要分配新页面时,这些页面没有旧状态。)

WAL mode 中,所有更改都写入预写日志。

在任何一种情况下,在数据量溢出page cache(默认大小约为 2 MB)之前,实际上什么都不会写入。

所以事务的大小不受内存的限制,只受磁盘空间的限制。

【讨论】:

    【解决方案2】:

    在批量插入查询中,command.ExecuteNonQuery() 返回受插入、更新或删除语句影响的行数。

    在您的情况下,每次成功插入后,它将返回 1 作为整数。 如果您不使用事务查询,则提交没有任何意义。如果您没有明确使用事务,则会自动提交更改。

    【讨论】:

    • 嗯.. 我认为这不是 OP 的要求?
    • 如果事务没有被使用,提交会出错,所以大概是这样。问题在于这些未提交的数据实际存储在哪里。
    • 这不是我的问题。我知道它会返回什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多