Giả sử tôi có loại truy vấnAndroid SQLite hiệu suất trong phức tạp truy vấn
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";
sau đó được sử dụng như thế này
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();
Vì vậy, nó chọn các giá trị từ nhiều bảng, hiện một số hoạt động vv Như bạn có thể thấy truy vấn phức tạp khủng khiếp (rất khó gỡ lỗi) và hiệu suất dường như không tốt như tôi mong đợi. Câu hỏi của tôi là:
- Tôi có thể cải thiện hiệu suất bằng cách sử dụng một số loại câu lệnh đã chuẩn bị không?
- Sẽ nhanh hơn khi thực hiện các truy vấn đơn giản hơn và xử lý chúng một cách thủ công với một số mã tùy chỉnh?
Cải thiện lược đồ cơ sở dữ liệu, khử chuẩn hóa, thêm chỉ mục và những thứ tương tự để truy vấn của bạn trở nên đơn giản và nhanh hơn. ['EXPLAIN QUERY PLAN'] (http://www.sqlite.org/eqp.html) là một cách tốt để xem sqlite nào với truy vấn của bạn – zapl
trước tiên bạn nên xem xét định dạng truy vấn bằng cách nào đó có thể đọc được. stackoverflow không phải là nơi để cho thấy rằng bạn có thể tạo các câu lệnh sql obfuscated. – tkr
@tkr À ... Đầu tiên, việc giảm giá cho việc từ chối các thay đổi của bạn là không đáng kể. Thứ hai, phần 'Chuỗi sql' là cần thiết vì mã sau sử dụng nó.Đó là lý do chính khiến tôi từ chối các thay đổi của bạn. Bạn không thể loại bỏ tất cả mã xung quanh và mong tôi chấp nhận nó. Tiếp theo thời gian, suy nghĩ về hành động của bạn và hành xử cho mình ... – user219882