оптимизация запросов для Android - PullRequest
0 голосов
/ 11 октября 2011

У меня есть база данных SQLite с около 400 000 записей. Для запроса БД я использую следующий метод:

public double lookUpBigramFrequency(String bigram) throws SQLException {

        SQLiteDatabase db = dbh.getReadableDatabase();
        double frequency = 0;
        bigram = bigram.toLowerCase();

        String select = "SELECT frequency FROM bigrams WHERE bigram = '"
                + bigram + "'";

        Cursor mCursor = db.rawQuery(select, null);
        if (mCursor != null) {

            if (mCursor.moveToFirst()) {
                frequency = Double.parseDouble(mCursor.getString(0));
            } else {
                frequency = 0;
            }
        }

        return frequency;


    }

но для извлечения одной записи требуется около 0,5 с, и, имея несколько запросов, он накапливается и метод выполняется в течение 10 с. Как ускорить это?

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Во-первых, используйте ИНДЕКС

http://www.sqlite.org/lang_createindex.html

в вашем случае это будет что-то вроде:

CREATE INDEX idx_bigram ON bigrams (bigram)

Во-вторых, используйте '?' вместо буквального запроса. Помогает sqlite для кеширования запросов:

String select = "SELECT frequency FROM bigrams WHERE bigram = ?";
Cursor mCursor = db.rawQuery(select, new String[]{ bigram });

В-третьих, я полагаю, что запрос более эффективен, чем rawQuery:

mCursor = dq.query("bigrams", new String[] { "frequency" }, "bigram = ?",
          new String[]{ bigram }, null, null, null, null);

В-четвертых, вы можете запросить несколько значений одновременно (несовместимо с пунктом 2):

SELECT frequency FROM bigrams WHERE bigrams IN ('1', '2', '3')

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

Редактировать

После просмотра этого вопроса IN предложения и заполнителей оказывается, что вы можете объединить 2 и 4 в конце концов (хотя не уверен, что это полезно)

0 голосов
/ 11 октября 2011

Всегда используйте механизм транзакций, если вы хотите выполнять много операций с базой данных

public static void doLotDBOperations() {
    try {
        // Code to Open Database

        // Start transaction
        sqlDb.beginTransaction();

        // Code to Execute all queries

        sqlDb.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // End all transaction
        sqlDb.endTransaction();

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