Android переменная SQLite выберите производительность запроса - какие-либо объяснения? - PullRequest
1 голос
/ 15 февраля 2012

У меня есть база данных SQLite с более чем 6000 строк адресов в таблице.Это база данных только для чтения - никаких обновлений или изменений после создания и развертывания приложения.У меня есть индекс на поле состояния.Мое приложение использует простой оператор выбора, чтобы получить все строки, которые соответствуют заданному состоянию.Я использовал операторы плана объяснения и объяснения, чтобы убедиться, что мой запрос использует индекс.

Большую часть времени запрос возвращается менее чем за секунду - не очень хорошо, но достаточно хорошо для моего приложения.

Время от времени запрос занимает больше времени - даже до 14 секунд, часто 3-4 секунды.Точно такой же запрос к той же базе данных (и таблице), доступной только для чтения, на том же телефоне, вызванном точно таким же двоичным файлом.

Я вижу, что сборка мусора не происходит, и изМониторинг logcat

Иногда возникает только одна вариация.Вариант, который создает противоречивый пользовательский интерфейс.

Похоже, что система баз данных SQLite используется другими приложениями, такими как почтовый клиент.Может ли быть так, что мой запрос ставится в очередь за запросами другого приложения, и, таким образом, изменение связано с тем, когда система баз данных с совместным использованием SQLite фактически выполняет мой запрос?Если это так, то можно ли «создать свой собственный экземпляр SQLite», чтобы я мог получить стабильную производительность?

Если это не общая система баз данных SQLite (и, таким образом, у меня есть собственный экземпляр)что еще может вызывать такие большие различия в производительности запросов, учитывая, что все остальное одинаково?

Обратите внимание, что я не могу легко перенести данные в память, чтобы выполнить запрос там, поскольку строки довольно длинные (больше информации, чем просто адрес), и у меня есть ряд других частей моего кода, которые используют более сложные запросы выбора.Я сузил вариацию производительности до самого простого запроса "select where state =" для этого вопроса (просьба о помощи).

1 Ответ

3 голосов
/ 15 февраля 2012

Похоже, что система баз данных SQLite используется другими приложениями, такими как почтовый клиент.

Не совсем так. Хранилище используется другими приложениями.А на устройствах Android 1.x и большинстве 2.x внутреннее хранилище отформатировано в YAFFS2, что позволяет только одному процессу одновременно получать доступ к хранилищу.Это должно быть меньшей проблемой на устройствах Android 3.0+ (и некоторых устройствах 2.3), которые работают с ext4 вместо YAFFS2.

Возможно, мой запрос ставится в очередь за запросами другого приложения и поэтомуЭто происходит из-за того, что система общих баз данных SQLite действительно выполняет мой запрос?

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

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