执行以下查询时,我们遇到了非常高的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。代码有什么问题吗?
发布于 2013-07-11 01:52:10
生成的数据总共约为9kB。代码有什么问题吗?
我不认为你的代码有任何问题。如果您有一个很大的表,我会确保userId在索引中,但我怀疑这不是问题所在。
@DatabaseField(index = true)
private String userId;如果event表中的外部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(...)方法来查看在减少返回的数据量后,它是否会变得更快。实际上,您可能不需要所有列。
您可能还希望记录执行每个查询所用的毫米数,以确保是查询导致了问题,尽管您可能已经进行了一些分析。
https://stackoverflow.com/questions/17553678
复制相似问题