Плохая реализация SQLite?Первый раз доступ к данным слишком медленный - PullRequest
5 голосов
/ 08 декабря 2010

Я новичок в программировании на Android, но я довольно привык работать с базами данных SQLite.

  • Мое приложение открывает базу данных SQLite3 на SD-карте и выполняет довольно сложный запрос (5объединения, 1 подзапрос, 2 предложения где) с использованием SQLiteDatabase.rawQuery

    public Cursor queryDataBase(String sql, String[] selectionArgs){
        Cursor c = myDB.rawQuery(sql, selectionArgs);
        return c;
    }
    
  • Оператор SQL задается жестко закодированным String.

  • запрос возвращает 585 строк с 24 столбцами.
  • Мне пришлось сделать компромисс между пространством хранения и индексацией, но для всех больших таблиц (на данный момент около 40 000 записей) используются индексы, SQLite показывает длязапрос: Steps: 155 , Sorts: 0, AutoIdx: 1077
  • Я не использую первичные ключи, поэтому я также не переименовал ничего в "_id".

  • ВыполнениеrawQuery относительно быстрый, время выполнения составляет около 2 мс .

  • Доступ к этим данным занимает слишком много времени, например, с помощью c.moveToFirst (), время выполненияоколо 1700 мс! (то же самое для Cursor.getRowCount () или, очевидно, все в первый разess к фактическому набору результатов).
  • Выполнение того же на ПК (2 ГГц, 1 ГБ ОЗУ, жесткий диск SATA2) с, например, SQLiteSpy, для отображения набора результатов требуется 15 мс
  • Делая это на ПК с реализацией C ++, это также 15 мс до 30 мс .

Так чего мне здесь не хватает?Возможно ли, что мой телефон с 800 МГц, 2 ГБ оперативной памяти, MicroSD примерно в 120 раз медленнее?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Выполнение rawQuery относительно быстрое, время выполнения составляет около 2 мс.

Доступ к этим данным занимает слишком много времени, например, с помощью c.moveToFirst (), время выполнения составляет около 1700 мс!(то же самое для Cursor.getRowCount () или, по-видимому, при первом доступе к фактическому набору результатов).

Это ключ: rawQuery фактически не выполняет запрос, но откладывается до первоговремя, когда необходимо использовать результаты запроса.

Источник: http://groups.google.com/group/android-developers/browse_thread/thread/c9277225f8dbc4d1/65de841f284f09e6?lnk=gst

1 голос
/ 09 декабря 2010

Помимо того, что проблема все еще немного медленнее, чем на ПК, проблема, по-видимому, заключается в обработке неиндексированных полей.

Хотя конфигурация в моем исходном сообщении была примерно в 120 раз медленнее, я пробовал то же самое сИндексируемая база данных (это означает, что индексы и первичные ключи везде, где это необходимо), и запрос, который теперь занимает 9 мс на ПК, теперь «всего» в 8 раз медленнее: время выполнения около 75 мс.довольно разочарованный результат, потому что я не хочу использовать индексы каждый раз, даже на очень маленьких таблицах.

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