медленные запросы db4o на Android - PullRequest
0 голосов
/ 30 августа 2011

В настоящее время я пытаюсь интегрировать db4o в свое приложение.У меня есть модель, которая содержит - скажем, 15 примитивов - завернутые в другие объекты.хранить их легко и быстро, но получить их - боль.Я пробовал NativeQuerys и SODA без особой разницы.Чтобы дать некоторым из них индекс, замедляется запрос еще больше.

в примере: у меня есть запрос, похожий на этот:

    public List<DatabaseReport> getCurrentDeviationReportsOnly(){
    final long now = System.currentTimeMillis();
    return getDatabase().query(new Predicate<DatabaseReport>() {
        @Override
        public boolean match(DatabaseReport candidate) {
            return candidate.getReport().getBegin().getMillis() < now
                && candidate.getReport().getEnd().getMillis() > now;
        }
    }, mTimeComparator);

mTimeComparator реализован следующим образом:

public static class DatabaseScheduleReportTimeComparator implements Comparator<DatabaseReport>{

    @Override
    public int compare(DatabaseReport object1,
            DatabaseReport object2) {

        long first = object1.getReport().getBegin().getMillis();
        long second = object2.getReport().getBegin().getMillis();
        if (first < second) return 1;
        if (first > second) return -1;
        else {
            first = object1.getReport().getEnd().getMillis();
            second = object2.getReport().getEnd().getMillis();
            if (first > second) return 1;
            if (first < second) return -1;
            else return 0;
        }

, поэтому с запросом выше я ожидаю получитькак 40 из 100 отчетов хранятся.Я измерил время для запроса и активации, и это около 3,5 секунд!Для меня это кажется ОЧЕНЬ медленным!Я немного поиграл и удалил Comparator в своем запросе.Теперь у меня время выполнения около 1,2 секунды.Если я сортирую их вручную с помощью Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator), это выполняется за 47 миллилитров !!Я делаю что-то неправильно?По какой причине db4o любит занимать в 10 раз больше времени, чем Collections.sort ()?

Каков наилучший способ оптимизации моей модели для db4o?(В этом случае Activatable бесполезен, поскольку ResultingList будет передан в ListAdapter, который требует каждого отдельного члена.)

Редактировать: в связи с ответом ниже, я также вставляю свой SodaQuery здесь:

public List<DatabaseReport> getCurrentDeviationReports(){
    final Date now = new Date(System.currentTimeMillis());

    Query query = getDatabase().query();
    query.constrain(DatabaseReport.class);
    query.descend("mReport").descend("begin").descend("datetime").constrain(now).smaller();
    query.descend("mReport").descend("end").descend("datetime").constrain(now).greater();
    query.descend("mReport").descend("begin").descend("datetime").orderAscending();
    query.descend("mReport").descend("end").descend("datetime").orderDescending();
    return query.execute();

}

поэтому «datetime» здесь является объектом java.util.date.Как я уже писал выше, мне кажется, что индексирование делает его МЕДЛЕННЫМ!

1 Ответ

3 голосов
/ 31 августа 2011

Есть несколько вещей, которые могут пойти не так.Вот мой контрольный список.

  • Убедитесь, что каждое поле в этой навигации проиндексировано.Поле 'report', 'begin' и поле 'millis'.
  • Является ли какое-либо из этих полей интерфейсом или общим типом?Тогда db4o не будет использовать индекс.Вам нужны конкретные типы, чтобы db4o мог выяснить, какой тип поля и использовать индексы.
  • Когда вы используете собственные запросы на Android, не то, что вам нужно оптимизировать их во время сборки.Причина в том, что оптимизатор запросов не может иметь дело с
  • Какой тип возвращается функцией getBegin ()?Если это обычная дата Java, то собственный оптимизатор не делает больше / меньше, чем сравнения.Это работает только с SODA
  • Запрос возвращает объект 40 из 100?Тогда сортировка не должна быть большой проблемой.
  • SODA также работает медленно?Это немного странно.Можете ли вы показать мне свой запрос SODA?
...