У меня один и тот же запрос выполняется снова и снова, и иногда он выполняется очень быстро, в других случаях это занимает гораздо больше времени. Кто-нибудь знает, что может быть причиной этого?
У меня есть провайдер контента, доступ к которому осуществляется через загрузчик в моей деятельности.
Он должен фильтровать более 10000 записей в базе данных, и я значительно оптимизировал его, чтобы сократить время запроса.
Часто запрос выполняется за 0-30 мс. Поскольку я распечатываю информацию каждый раз, когда выполняется запрос.
Но теперь я заметил, что с большим количеством данных запрос иногда выполняется очень быстро, а иногда это занимает 3-5 секунд. Использование того же выбора / запроса / аргументов, что и для быстрого выполнения.
Журнал распечатывает приведенное ниже время: И запрос точно такой же.
Query took 15ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 15ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3499ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3502ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 18ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 6ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3618ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3601ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Я записываю этот лог выше как таковой в провайдере
queryBuilder.setProjectionMap(projectionMap);
long start = System.currentTimeMillis();
retCursor = queryBuilder.query(mOpenHelper.getReadableDatabase(), null,
selection,
selectionArgs,
null,
null,
null, null);
//This goes with the log statement, to prevent a null pointer on selectionArgs
if (selectionArgs == null) {
selectionArgs = new String[]{"null"};
}
Log.d(LOG_TAG, "Query took " + (System.currentTimeMillis() - start) + "ms to complete SELECTION:" +
" Rows: " + retCursor.getCount() +
" :: " + selection + " sel args: " + Arrays.toString(selectionArgs));
Редактировать: Таблица, из которой я берусь, содержит полмиллиона строк. Но я вставил столбец с флагом, чтобы указать, была ли это последняя запись, вставленная для определенного пользователя. И проиндексировал это. Это позволило мне быстро получить строку для каждой последней позиции пользователей. Новая позиция удаляет флаг на старой позиции и вставляет новую позицию с установленным флагом. Я могу запросить таблицу менее чем за 20 мс, или те, которые, кажется, застряли примерно на 2,5 секунды или более. что, кажется, происходит в 30-40% случаев.