Всем привет.
Понадобилось использовать SQL в приложении, но реализовав всё ужаснулся от скорости работы БД.
Выполнение около 7000-9000 запросов занимает более 5 минут О_о. В связи с этим, подумал об альтернативе SQL, но что-то ничего толкового не нашёл в гугле, кроме Realm.
Собственно кто сталкивался с похожими проблемами или пользовался альтернативами SQLite, прошу высказать свои мнения/предложения/рекомендации относительно того или другого решения.
Ещё как альтернатива, думаю взять все данные, сформировать JSON и сохранить в файле, а при запуске приложения парсить... Кто, что думает по этому поводу? :)
Что-то мне подсказывает, что вы делаете что-то не так. 9000 запросов я лично никогда не делал, но несколько сотен операций записи/обновления/чтения делается за считаные секунды. Принципиально SQLite в андроиде ничем не отличается от SQLite на "не андроиде".
FoxInSox: Отличается, ещё как отличается - своей тормознутостью. На PHP например то же выполняется менее чем за 2 секунды, а тут не менее 5 минут нужно.
Я бы в таком случае хранил на сервере. Из минусов - привязка к Интернет.
А нужно ли в приложении выполнять 9000 запросов... Может лучше подумать об оптимизации?
Зачем хранить на сервере информацию, которая используется только в приложении, генерируется и обрабатывается там же? Не вариант. Я думал наоборот оптимизировать и ускорить работу приложения путём создания БД и последующей работы с ней, т.к. при каждом запуске приложения генерируются все необходимые данные, что занимает не малое время. И в место того, чтобы каждый раз генерировать новые данные, решил генерировать их один раз и после при каждом запуске брать их из БД проверять и обновлять в случае необходимости. Что теоретически (как я думал) значительно ускорит работу приложения, но оказалось всё совершенно наоборот. 9000 - это и есть с оптимизацией и число очень примерное, 9000 может и не будет, но 4-5 тыс. будет точно.
Atllantis: Хранить на сервере не для хранения... а для обработки так сказать. Без контекста задачи Вам никто ничего не подскажет. У всех будет вопрос: а зачем 9000 записей обрабатывать при инициализации?
вангую на транзакции, скорее всего вы выполняете большое количество записей бд
+возможно вам стоит лучше продумать структуру бд (не хочу обидеть, но иногда поподаются странные решения)
Realm не советую, лично мне не понравилось то что с объектом можно работаь только в том потоке в котором он создан, но возможно для вас это оптмиальное решение
Да, первый раз много записи, и занимает всё это много времени.
Но в последующем используется только чтение и обновление при необходимости...
Структура БД у меня оптимальная и лучше уже не сделать.
По поводу Realm - у меня работа с БД только в одном потоке, так что думаю для меня это не критично на данный момент. А как он по скорости работы? Надеюсь значительно быстрее чем SQLite?
А вообще, подумал может и правда лучше сформировать JSON и сохранить в файле. Т.к. доступ к БД мне нужен только в момент запуска приложения, то и тут проблем не должно быть, но тогда будет проблематично искать необходимые данные. Или ещё проще запихнуть всё по классам, сериализовать и сохранить в файл (бред возможно...). :)
Atllantis: чтобы не тормазила запись используйте транзакции, в sqlite под android(не только, если не ошибаюсь это общее) по умолчанию на каждый запрос транзакция. Опишите более подробно задачу, возможно вам все эти данные не нужны сразу, даже если это игра что то странное вырисоывывается.
Atllantis: ,будьте готовы к тому что чтобы передать данные в ui поток из потока в котором выполянлся запрос их нужно будет скопировать в промежуточные модели
gadfi: тоже Realm не понравился. Точнее как, это весьма интересное решение, но еще (на Android) очень сырое и со многими недостатками, такими, как только дефолтные геттеры-сеттеры, невозможность использования статических полей в модели... Однако, периодически стоит проверять, что у них новенького, возможно, детские болезни скоро исправят )