Скорость транзакции против скорости запроса - PullRequest
0 голосов
/ 31 мая 2011

Что быстрее, одна транзакция с несколькими запросами или для каждого запроса отдельная транзакция?

Одна транзакция с несколькими запросами:

 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 ]

2 голосов
/ 31 мая 2011

Это компромисс. Почти наверняка будет быстрее выполнять одну транзакцию с большим количеством операторов, так как вы избегаете накладных расходов на фиксацию этих транзакций до конца, но мера, не угадывайте!

С другой стороны, вы не хотите вкладывать слишком много в одну транзакцию, поскольку СУБД должна поддерживать управляющую информацию о транзакции (журналы отката или отката и т. Д.).

Я бы обычно выбирал полпути. Делайте ваши вставки в функции, которая автоматически фиксирует каждую 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 голос
/ 31 мая 2011

Самый быстрый способ определить скорость частичного исходного кода - сделать цикл из примерно 5000 итераций вокруг конкретной части (возможно, больше, зависит от того, как быстро выполняется код) и измерить разницу во времени между отметкой времени до начала цикла ивременная метка после этого.Работает на любом языке, который поддерживает любое время измерения.Надеюсь, это поможет.

1 голос
/ 31 мая 2011

Одна транзакция со многими вставками всегда будет быстрее - намного быстрее!Тем не менее, если что-то не получится, вы потеряете все предыдущие вставки ...

0 голосов
/ 31 мая 2011

Будет быстрее использовать одну транзакцию, но это не значит, что она использует меньше ресурсов.

При первой вставке транзакция заблокирует часть таблицы или всю таблицу.Любой другой запрос, пытающийся использовать таблицу, будет поставлен в очередь до завершения транзакции.Вам следует учитывать не только время, необходимое для вставок, но и время, которое тратится впустую, когда другие запросы не могут быть выполнены.

Если имеется несколько одновременных соединений, что обычно не является большой проблемой.Если у вас большая нагрузка на базу данных, вы должны рассмотреть возможность использования меньших транзакций.Если вы заблокируете таблицу на более короткое время, вы избежите постановки запросов в очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...