Я использую 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. Созданы ли транзакции для операторов выбора?
Может кто-нибудь сказать мне, как еще оптимизировать это?