Much more efficient loading of messages
Stephen Paul Weber
created 2 years ago
Doing the cross-DB JOIN in the outer query murders performance, but if
we just look up against a single DB which rows we want, then do the full
load/join on only those rows, it is *much* faster.
Change summary
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 14
1 file changed, 10 insertions(+), 4 deletions(-)
Detailed changes
@@ -1107,9 +1107,12 @@ public class DatabaseBackend extends SQLiteOpenHelper {
"SELECT * FROM " + Message.TABLENAME + " " +
"LEFT JOIN cheogram." + Message.TABLENAME +
" USING (" + Message.UUID + ")" +
- "WHERE " + Message.CONVERSATION + "=? " +
+ " WHERE " + Message.UUID + " IN (" +
+ "SELECT " + Message.UUID + " FROM " + Message.TABLENAME +
+ " WHERE " + Message.CONVERSATION + "=? " +
"ORDER BY " + Message.TIME_SENT + " DESC " +
- "LIMIT " + String.valueOf(limit),
+ "LIMIT " + String.valueOf(limit) + ") " +
+ "ORDER BY " + Message.TIME_SENT + " DESC ",
selectionArgs
);
} else {
@@ -1119,10 +1122,13 @@ public class DatabaseBackend extends SQLiteOpenHelper {
"SELECT * FROM " + Message.TABLENAME + " " +
"LEFT JOIN cheogram." + Message.TABLENAME +
" USING (" + Message.UUID + ")" +
- "WHERE " + Message.CONVERSATION + "=? AND " +
+ " WHERE " + Message.UUID + " IN (" +
+ "SELECT " + Message.UUID + " FROM " + Message.TABLENAME +
+ " WHERE " + Message.CONVERSATION + "=? AND " +
Message.TIME_SENT + "<? " +
"ORDER BY " + Message.TIME_SENT + " DESC " +
- "LIMIT " + String.valueOf(limit),
+ "LIMIT " + String.valueOf(limit) + ") " +
+ "ORDER BY " + Message.TIME_SENT + " DESC ",
selectionArgs
);
}