sqlite оптимизировать производительность чтения - PullRequest
0 голосов
/ 18 марта 2012

Я использую sqlite в приложении для iPhone для базы данных только для чтения. Один вариант использования включает в себя много операторов выбора, каждый из которых возвращает около 3 строк. Невозможно уменьшить количество запросов, поскольку параметры следующего запроса зависят от результата предыдущего запроса. Сам запрос довольно прост:

SELECT int1, int2, int3, int4 , int5, int6, int7 FROM sometable WHERE (int1 = ? AND int2 = ?) or (int3 = ? and int4 = ?) ORDER BY ROWID

Таблица имеет индекс (int1, int2) и индекс (int3, int4). Все int имеют тип данных INTEGER

Запрос выполняется через C-API. Оператор компилируется с помощью sqlite3_prepare_v2 () и используется для всех запросов. После каждого запроса sqlite3_reset () в операторе выполняется перед привязкой новых параметров.

Файл базы данных открывается с флагами SQLITE_OPEN_READONLY и SQLITE_OPEN_NOMUTEX.

Профилирование на IPhone показывает, что большую часть времени тратится в sqlite3_step () -> sqlite3VdbeExec-> sqlite3BtreeBeginTrans-> sqlite3PagerSharedLock-> line pVfs-> xAccess ()

Я не эксперт по sqlite, но мне кажется, что на ненужную блокировку тратится время. Не требуется, поскольку гарантируется, что при выполнении этих запросов нет другого доступа к базе данных. Мне также интересно, о sqlite3BtreeBeginTrans. Созданы ли транзакции для операторов выбора?

Может кто-нибудь сказать мне, как еще оптимизировать это?

1 Ответ

1 голос
/ 19 марта 2012

Правильный ответ из списка рассылки sqlite-user: http://sqlite.org/pragma.html#pragma_locking_mode

Ускорение примерно на 40% ...

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