0

执行以下查询时,我们遇到了非常高的 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。代码有什么问题吗?

4

1 回答 1

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 不算大,但从数据库的角度来看也不算小。QueryBuilder.selectColumns(...)一旦减少返回的数据量,您可能会使用这些方法来查看它是否会变得更快。您实际上可能不需要所有列。

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

于 2013-07-10T17:52:10.063 回答