Как улучшить производительность моего запроса SELECT в Sqlite / Android? - PullRequest
1 голос
/ 30 января 2012

Я получаю низкую производительность и, возможно, странное поведение с простым запросом SELECT в Sqlite & Android. SqliteDatabase.query() выполняет мой запрос всего за 1 мс, но выборка результатов с Cursor.get*() занимает более 150 мс, чтобы вернуть только 8 строк!

Я пытаюсь найти все строки в таблице english, где столбец word начинается с "префикса" (произвольная строка), отсортировать результаты по столбцу row и вернуть только первые 8 результаты.

Вот мой код:

String columns[] = {"word", "rank"};
Cursor cursor = mDB.query("english", columns, "word LIKE '" + prefix + "%'", null, null, null, "rank,word", "8");

// It takes only 1 ms to get here

String word = "";
int rank = 0;
if (cursor.moveToFirst()){
    do {
        word = cursor.getString(0);
        rank = cursor.getInt(1);
    }
    while(cursor.moveToNext());
}

cursor.close();

// It takes over 150 ms to get here!

Определение таблицы для english:

CREATE TABLE en (_id INTEGER PRIMARY KEY, word TEXT, rank INTEGER)

Содержит около 65 000 записей. Он также индексирует word и rank, с третьим индексом для обоих (я был в отчаянии!):

CREATE INDEX "rank" ON "en" ("rank" ASC)
CREATE INDEX "word" ON "en" ("word" ASC)
CREATE INDEX "word_rank" ON "en" ("word" ASC, "rank" ASC)

Заранее спасибо!

1 Ответ

2 голосов
/ 30 января 2012

Метод запроса фактически не извлекает все данные, курсор извлекает их при перемещении по строкам. Поэтому имеет смысл, что методы Cursor.move * () работают медленнее, чем запрос.

Эта концепция «отложенной загрузки» помогает экономить память, поскольку только нужные данные извлекаются по мере необходимости.

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

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