SQLite оптимизация с использованием транзакций - PullRequest
2 голосов
/ 20 марта 2011

Я создал приложение для iOS, которое, когда пользователь нажимает на кнопку, создает поток, и поток будет выполнять операторы SELECT 50 раз.Я читал о методе оптимизации из http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#transactions Он написал (выделено мое)

Если уже не в транзакции, для каждого оператора SQL была начата новая транзакция.Это очень дорого, так как требует повторного открытия, записи и закрытия файла журнала для каждого оператора.Этого можно избежать, оборачивая последовательности операторов SQL в операторы BEGIN TRANSACTION; и END TRANSACTION;. Это ускорение также получено для операторов, которые не изменяют базу данных.

Итак, я попытался добавить BEGIN TRANSACTION; в начале потока и END TRANSACTION; иконец потока, и я обнаружил, что это сократило время выполнения наполовину.Однако, поскольку он находится в потоках, иногда возникает такая ситуация:

BEGIN TRANSACTION from thread 1
BEGIN TRANSACTION from thread 2
END TRANSACTION from thread 2
END TRANSACTION from thread 1

Второй оператор BEGIN и второй оператор END не будут выполнены.Поэтому я хочу переместить операторы BEGIN / END из потоков, т.е. вызывать BEGIN только один раз в начале приложения и END в конце приложения.Но я не уверен, израсходует ли это память?т.е. открыть транзакцию на протяжении всего времени жизни приложения, не совершая ее.База данных доступна только для чтения, поскольку она поставляется вместе с приложением.

Спасибо за помощь.

1 Ответ

0 голосов
/ 20 марта 2011

Если это база данных только для чтения, попробуйте открыть ее с помощью

sqlite3_open_v2("path/to/database", &connection,
                SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX, 0);
sqlite3_exec(connection,
             "PRAGMA locking_mode = EXCLUSIVE; PRAGMA journal_mode = OFF;",
             0, 0, &errmsg);

затем разделяем объект connection между всеми вашими потоками. Это должно дать вам все преимущества в производительности, если оставить транзакцию открытой, не оставляя транзакцию открытой. (Возможно, вам не понадобится вторая команда. Я хотел бы думать, что SQLite был достаточно умен, чтобы признать, что ему не нужно блокировать или вести журнал для соединения только для чтения, но я не верю в это.)

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