私は、クエリAndroidのSQLiteの性能
このCursor cursor = database.rawQuery(sql, args);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
TeamStats stat = new TeamStats();
stat.setTeamId(cursor.getLong(0));
stat.setTeamName(cursor.getString(1));
stat.setGamesPlayed(cursor.getInt(2));
stat.setWins(cursor.getInt(3));
stat.setTies(cursor.getInt(4));
stat.setLoses(cursor.getInt(5));
stat.setGoalsOwn(cursor.getInt(6));
stat.setGoalsAgaist(cursor.getInt(7));
stat.setScore(cursor.getInt(8));
stat.setPoints(cursor.getInt(9));
stats.add(stat);
cursor.moveToNext();
}
cursor.close();
のように使用されているので、それは多くのテーブルから値を選択し
String sql = "SELECT s.team_id, s.team_name, s.gp, s.w, s.t, s.l, s.go, s.ga, s.score, s.p FROM "
+ "(SELECT team_id, team_name, SUM (gp) gp, SUM (w) w, SUM (t) t, SUM (l) l, SUM (GO) go, SUM (GA) ga, SUM (GO)- SUM (GA) score, SUM (2*w+t) p FROM "
+ "(SELECT t._id team_id, t.name team_name, COUNT(CASE WHEN score_home IS NOT NULL THEN 1 END) gp, COUNT (CASE WHEN score_home > score_away THEN 1 END) w,"
+ " COUNT (CASE WHEN score_home = score_away THEN 1 END) t, COUNT (CASE WHEN score_home < score_away THEN 1 END) l,"
+ " SUM (score_home) go, SUM (score_away) ga"
+ " FROM team_table t LEFT OUTER JOIN match_table m ON m.team_home = t._id"
+ " WHERE t.tournament_id = ? GROUP BY t._id, t.name"
+ " UNION ALL"
+ " SELECT t._id team_id, t.name team_name, COUNT(CASE WHEN score_away IS NOT NULL THEN 1 END) gp, COUNT (CASE WHEN score_home < score_away THEN 1 END) w,"
+ " COUNT (CASE WHEN score_home = score_away THEN 1 END) t, COUNT (CASE WHEN score_home > score_away THEN 1 END) l,"
+ " SUM (score_away) go, SUM (score_home) ga"
+ " FROM team_table t LEFT OUTER JOIN match_table m ON m.team_away = t._id"
+ " WHERE t.tournament_id = ? GROUP BY t._id, t.name)"
+ " GROUP BY team_id, team_name) s"
+ " ORDER BY s.p DESC, s.score DESC, s.go ASC";
のこの種を持っているとし、いくつかの操作を行いますなどとして、クエリがひどく複雑(非常にデバッグが難しい)であり、パフォーマンスが期待したほど良くないように見えます。私の質問は次の通りです:
- 何らかの準備文を使ってパフォーマンスを改善することはできますか?
- さらに簡単なクエリを実行して、カスタムコードで手動で処理する方が速いでしょうか?
データベーススキーマを改善し、正規化を解除し、インデックスを追加してクエリがより簡単かつ高速になるようにします。 ['EXPLAIN QUERY PLAN'](http://www.sqlite.org/eqp.html)は、クエリでsqliteが何をするかを確認する良い方法です。 – zapl
まず、何らかの形でクエリをフォーマットすることを検討する必要があります。 stackoverflowは、難読化されたSQL文を作成できることを示す場所であってはなりません。 – tkr
@tkrまあ...まず、あなたの変更を拒否するためのdownvotingは、不自由です。次に、 'String sql'部分は必須です。これは、次のコードで使用されるためです。それが私があなたの変更を拒否した主な理由でした。周囲のコードをすべて削除して、私がそれを受け入れることを期待することはできません。次回は、あなたの行動について考え、自分自身を行動してください。 – user219882