执行以下查询时,我们遇到了非常高的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。代码有什么问题吗?
答案 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(...)
方法查看一旦减少返回的数据量,它是否会变快。您实际上可能不需要所有列。
您可能还想记录执行每个查询所花费的毫秒数,以确保它是导致问题的查询,尽管您可能已经进行了一些分析。