Оптимизация выбора с транзакцией под SQLite 3 - PullRequest
20 голосов
/ 08 сентября 2011

Я читал, что упаковка большого числа SELECT в BEGIN TRANSACTION/COMMIT была интересной оптимизацией.

Но действительно ли эти команды необходимы, если я использую "PRAGMA journal_mode = OFF" раньше?(Который, если я помню, отключает журнал и, очевидно, систему транзакций.)

Ответы [ 2 ]

21 голосов
/ 14 октября 2013

Обратите внимание, что я не согласен с BigMacAttack.

Для SQLITE упаковка SELECT в транзакцию делает что-то делает: Это уменьшает количество блокируемых ключей SHARED, которые получаются, а затем удаляются.

Ссылка: http://www.mail -archive.com / SQLite пользователи% 40sqlite.org / msg79839.html

Так что я думаю, что транзакция также будет полезна, даже если у вас отключен journal_mode, потому что еще есть издержки блокировки, которые нужно учитывать.

Может быть, read_uncommitted - это то, что вы могли бы рассмотреть - я думаю, что это отключит блокировку SHARED.

14 голосов
/ 09 сентября 2013

"Используйте транзакции - даже если вы просто читаете данные. Это может дать несколько миллисекунд."

Я не уверен, куда попадает блог Katashrophos.netэта информация, но завершение SELECT операторов в транзакциях ничего не делает.Транзакции всегда и только используются при внесении изменений в базу данных, и транзакции не могут быть отключены.Это требование.Многие не понимают, что если вы вручную BEGIN и COMMIT не сделаете транзакцию, каждый оператор будет автоматически помещен в свою собственную уникальную транзакцию.Обязательно прочитайте вопрос de facto о повышении производительности sqlite .Автор блога , возможно, пытался сказать, что если вы планируете сделать INSERT, затем SELECT, а затем еще один INSERT, то это повысит производительность до уровня вручнуюоберните эти утверждения в одну транзакцию.В противном случае sqlite автоматически поместит два оператора вставки в отдельные уникальные транзакции.

Согласно документации "SQL as Understood by SQLite" , касающейся транзакций:
"Изменения не могутв базу данных, за исключением транзакции. Любая команда, которая изменяет базу данных (в основном любая команда SQL, отличная от SELECT), автоматически запускает транзакцию, если она еще не действует. "

Наконец, отключение ведения журнала с помощью PRAGMA journal_mode = OFF не отключает транзакции, только ведение журнала.Но отключение журнала также является хорошим способом повышения производительности.Обычно после каждой транзакции sqlite документирует транзакцию в журнале.Когда этого не требуется, вы получаете повышение производительности.

ОБНОВЛЕНИЕ:
Таким образом, на меня обратили внимание "изящные кубики", что документация SQLiteЗаявление, которое я цитирую выше, вводит в заблуждение.SELECT операторы действительно используют систему транзакций.Это используется для получения и снятия блокировки SHARED в базе данных.В результате действительно эффективнее объединять несколько операторов SELECT в одну транзакцию.При этом блокировка получается и снимается только один раз, а не для каждого отдельного оператора SELECT.Это в конечном итоге становится немного более эффективным, а также гарантирует, что все операторы SELECT будут иметь доступ к одной и той же версии базы данных в случае, если что-то было добавлено / удалено какой-либо другой программой.

...