"Используйте транзакции - даже если вы просто читаете данные. Это может дать несколько миллисекунд."
Я не уверен, куда попадает блог 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
будут иметь доступ к одной и той же версии базы данных в случае, если что-то было добавлено / удалено какой-либо другой программой.