【问题标题】:Transaction speed vs. Query speed交易速度与查询速度
【发布时间】:2011-09-05 05:50:39
【问题描述】:

哪个更快,一个事务处理多个查询,还是每个查询一个单独事务?

一个事务有很多查询:

 db.transaction(function (tx){
      tx.executeSql('INSERT INTO TEST VALUES ("Halo1" ,"Halo2")', [], win, fail);        
      tx.executeSql('INSERT INTO TEST VALUES ("Halo3" ,"Halo4")', [], win, fail);
      tx.executeSql('INSERT INTO TEST VALUES ("Halo5" ,"Halo6")', [], win, fail);
      .
      .
      .
      .
   });

每个查询一个事务:

    db.transaction(function(tx){
        tx.executeSql('INSERT INTO TEST VALUES ("Halo1" ,"Halo2")', [], win, fail);

    });

    db.transaction(function(tx){
        tx.executeSql('INSERT INTO TEST VALUES ("Halo3" ,"Halo4")', [], win, fail);

    });
    and so on.....

我需要这些信息,因为我必须在一张表中插入许多记录。

【问题讨论】:

  • 请注意,速度并不是真正的重点:事务旨在用于必须完全发生或根本不发生(“原子性”)的操作;这是否比在自己的事务中进行每个操作更快是无关紧要的。

标签: javascript sql sqlite cordova


【解决方案1】:

这是一种权衡。几乎可以肯定,使用大量语句执行一项事务会更快,因为您避免了直到最后提交这些事务的开销,但是衡量,不要猜测!

另一方面,您不希望在单个事务中投入太多,因为 DBMS 必须维护有关事务的控制信息(回滚或前滚日志等)。

我通常会选择中途位置。在每个 N 插入时自动提交的函数中进行插入。类似伪代码的东西:

counter = 50
start new transaction                  # always start a transaction
for each insert_cmd in insert_list:
    call do_it (insert_cmd)
commit current transaction             # and always end it

def do_it (insert_cmd):
    if counter < 1:
        commit current transaction
        start new transaction
        counter = 50
    execute insert_cmd
    counter = counter - 1

只要确保您没有绕过创建交易的全部原因。它们是您的ACID 属性(原子性)中的A。如果插入需要作为单个事务完成以正确维护数据,则执行以这种方式。

【讨论】:

    【解决方案2】:

    一个包含许多插入的事务总是会更快 - 更快!也就是说,如果发生故障,您将丢失所有以前的插入...

    【讨论】:

    • 这就是 transactions 的重点:例如要将 100 美元从一个帐户转移到另一个帐户,您需要进行一些初步查询(例如,健全性检查和记录),然后尝试从源帐户中移除 100 美元。糟糕,资金不足,ABORT。
    【解决方案3】:

    确定部分源代码速度的最快方法是围绕特定部分进行大约 5.000 次迭代的循环(可能更多,取决于代码执行的速度)并测量循环开始之前的时间戳与之后的时间戳。 适用于支持任何时间测量的每种语言。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      使用单个事务会更快,但这并不意味着它使用的资源更少。

      在第一次插入时,事务将锁定部分表或整个表。任何其他尝试使用该表的查询都将排队,直到事务结束。您不仅应该考虑插入将花费的时间,还应该考虑其他查询无法运行时所浪费的时间。

      如果并发连接很少,这通常不是什么大问题。如果数据库负载很大,则应考虑使用较小的事务。通过将表锁定更短的时间,您将避免查询排队。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 2014-10-28
        • 2013-03-15
        相关资源
        最近更新 更多