事务速度与查询速度

时间:2011-05-31 06:32:51

标签: javascript sql sqlite cordova

什么是更快,一个包含许多查询的事务或每个查询是一个单独的事务?

包含许多查询的一个事务:

 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.....

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

4 个答案:

答案 0 :(得分:2)

这是一种权衡。因为你要避免将这些事务提交到最后,但是测量,不要猜测!

另一方面,您不希望过多地放入单个事务,因为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

请确保您没有规避创建交易的全部原因。它们是A属性(原子性)中的ACID。如果要求插入作为单个事务完成以正确维护数据,那么以这种方式

答案 1 :(得分:1)

一个包含许多插入的事务总是会更快 - 更快!也就是说,如果出现问题,您将丢失以前的所有插入内容......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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