SQLite очень медленно работает в Samsung Galaxy GT-I9000 - PullRequest
2 голосов
/ 17 августа 2010

У меня проблема с производительностью базы данных SQLite в приложении Android на устройстве Samsung Galaxy GT-I9000. База данных содержит 10 таблиц с 3 - 8 столбцами в каждой.

Как только файл базы данных набирает около 400 КБ, запросам на обновление / вставку требуется гораздо больше времени - 2 секунды! По сравнению с другими устройствами (HTC Magic, HTC Desire) запросы на обновление / вставку занимают около 40 мсек!

Файл базы данных находится в каталоге данных приложения. Перемещение файла базы данных на SD-карту значительно увеличивает скорость.

Периодические команды ANALYZE и VACUUM не влияют на скорость. А также команда PRAGMA cache_size.

У вас есть идеи, как улучшить производительность?

Любая идея приветствуется, за исключением хранения базы данных на SD-карте или разбиения базы данных на множество файлов, содержащих по одной таблице каждый.

Ответы [ 4 ]

4 голосов
/ 18 августа 2010

Доступ к внутренней SD-карте очень медленный в Samsung Galaxy S. Существует множество неофициальных исправлений лагов , кажется, что файловая система RFS от Samsung отвечает за задержки.

Надеемся, что Samsung выпустит обновление, которое устранит эту проблему, до тех пор, пока ваш лучший выбор - избегать ввода-вывода, если это возможно.

3 голосов
/ 17 августа 2010

Использовать транзакции и параметризованные запросы.Sqlite должен анализировать каждый SQL-оператор, если вы не используете параметризованные запросы.Весь этот ненужный синтаксический анализ делает простой оператор вставки в 2–3 раза медленнее.Смотрите здесь: Как мне обойти проблему "" "в sqlite и c #?

Использование транзакций также очень важно, потому что Sqlite может делать вставку очень быстро, но коммиты медленныеВы должны объединить ваши вставки / обновления и удаления в одну большую транзакцию.

2 голосов
/ 18 августа 2010

Это очень помогло и побудило меня искать еще больше. И я нашел решение, которое дает огромный импульс:

PRAGMA синхронно = ВЫКЛ.

INSERT / UPDATE Запросы теперь выполняются в 4 раза быстрее.

Однако он имеет небольшой недостаток.

Подробнее здесь:
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#pragmas

2 голосов
/ 17 августа 2010

Команды массовой вставки должны выполняться внутри транзакции:

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