From cea89ff9ec05cd2afbe480f234b8ed75c8775bfa Mon Sep 17 00:00:00 2001 From: Chris Heywood <15127-creywood@users.noreply.gitlab.gnome.org> Date: Sat, 5 Sep 2020 10:02:53 +1000 Subject: [PATCH] Fix query performance regression brought in with !556 The join used to determine how many messages should be left in the folder was inefficient. The following query has also been performance tested and found to be more efficient as a join (instead of a subquery). --- src/engine/imap-db/imap-db-folder.vala | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/engine/imap-db/imap-db-folder.vala b/src/engine/imap-db/imap-db-folder.vala index de015f5a..4b015cd1 100644 --- a/src/engine/imap-db/imap-db-folder.vala +++ b/src/engine/imap-db/imap-db-folder.vala @@ -943,17 +943,20 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics { Gee.ArrayList deleted_primary_keys = null; yield db.exec_transaction_async(Db.TransactionType.RO, (cx) => { - // MessageLocationTable.ordering isn't relied on due to IMAP folder - // UIDs not guaranteed to be in order. + // MessageLocationTable.ordering isn't relied on throughout due + // to IMAP folder UIDs not guaranteed to be in order. Make sure to + // performance test any changes to the select queries below. StringBuilder sql = new StringBuilder(); sql.append(""" SELECT COUNT(*) - FROM MessageLocationTable ml - INNER JOIN MessageTable m - INDEXED BY MessageTableInternalDateTimeTIndex - ON ml.message_id = m.id - WHERE ml.folder_id = ? - AND m.internaldate_time_t >= ? + FROM MessageLocationTable + WHERE folder_id = ? + AND message_id IN ( + SELECT id + FROM MessageTable + INDEXED BY MessageTableInternalDateTimeTIndex + WHERE internaldate_time_t >= ? + ) """); Db.Statement stmt = cx.prepare(sql.str);