2009-05-09 2 views
0

У меня есть относительно сложные sqlite-запросы, запущенные в моем приложении для iPhone, а некоторые занимают слишком много времени (более 15 секунд). В базе данных всего 430 записей. Одна вещь, которую я заметил, заключается в том, что открытие нового соединения с базой данных (которое я делаю только один раз) и выполнение результатов запроса (с sqlite3_step()) приводит к запуску sqlite3_backup_init() и sqlite3_enable_shared_cache(), которые занимают 4450 мс и 3720 мсек соответственно времени обработки в течение всего периода тестирования. Я попытался использовать sqlite3_enable_shared_cache(0);, чтобы отключить совместное кэширование, прежде чем открывать соединение с базой данных, но это, похоже, не влияет.sqlite3_enable_shared_cache и sqlite_backup_init замедление выполнения на iPhone

Кто-нибудь знает, как отключить их, чтобы я мог улучшить скорость?

+0

Это кажется странным. Я бы не ожидал, что любая из этих функций будет вызываться внутренним кодом SQLite (кроме, возможно, sqlite3_enable_shared_cache с аргументом 0). Вы используете какую-либо оболочку или просто C api? –

+0

Просто C api, который поставляется с iPhone SDK. –

ответ

1

Ну, я полагаю, это прямо не отвечает на вопрос, но частью проблемы было использование кросс-соединения вместо левого соединения. Это сократило время запроса от примерно 4000 мс до 60 мс. Кроме того, функция backup_init больше не вызывается, а enable_shared_cache не вращается.

0

Я исправил свое приложение, заменив внутреннее соединение левым соединением. Мои данные позволяют это. Если данные не позволяют рассмотреть добавление где положение

яблока в внутреннем соединении бананы б на b.id = A.id

против

яблок налево присоединиться бананы б на б. id = a.id, где b.id не является нулевым

+0

Похоже на то же решение, которое частично разрешило мою проблему. –