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 側にパフォーマンスの問題があるとは思いません。

試すことができるクエリの最適化の 1 つ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(...)返されるデータの量を減らしたときに速度が向上するかどうかを確認できます。実際にはすべての列が必要なわけではありません。

すでにプロファイリングを行っている場合でも、問題の原因がクエリであることを確認するために、各クエリの実行にかかるミリ秒数をログに記録することもできます。

于 2013-07-10T17:52:10.063 に答える