ORMLite查询的CPU负载很高

时间:2013-07-09 16:39:30

标签: android ormlite

执行以下查询时,我们遇到了非常高的CPU负载:

        //find user
    QueryBuilder<UserDTO, Long> userQb = userDao.queryBuilder();
    userQb.where().idEq(userId);
    UserDTO data = userQb.queryForFirst();

    //find events
    if (data != null) {
        QueryBuilder<EventViewDTO, Long> eventQb = eventDao.queryBuilder();
        data.eventViews = (ArrayList<EventViewDTO>) eventQb.join(userQb).query();
    }

    return data;

结果数据总共约为9kB。代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

  

结果数据总共约为9kB。代码有什么问题吗?

我没有立即发现您的代码有任何问题。如果您有一个大表,我会确保userId在索引中,但我怀疑这不是问题。

@DatabaseField(index = true)
private String userId;

如果该表很大,您可能还想在事件表中向外部UserDTO字段添加索引,但除非您的数据库很大,否则我不认为性能问题在Sqlite端。

您可以尝试的一个查询优化是在获取事件而不是连接时使用另一个WHERE约束:

QueryBuilder<EventViewDTO, Long> eventQb = eventDao.queryBuilder();
// the "userDto" needs to be changed to whatever the foreign field name is
data.eventViews = eventQb.where().eq("userDto", data.id);

如果查看日志,您可能会看到大量的GC活动,我怀疑这也是性能接收器。虽然9k不是太大,但从DB的角度来看它也不小。您可以使用QueryBuilder.selectColumns(...)方法查看一旦减少返回的数据量,它是否会变快。您实际上可能不需要所有列。

您可能还想记录执行每个查询所花费的毫秒数,以确保它是导致问题的查询,尽管您可能已经进行了一些分析。