From 1d1e8a5634281c4bc931527575ebf0679d6df880 Mon Sep 17 00:00:00 2001 From: "Olivier Wilkinson (reivilibre)" Date: Fri, 10 Nov 2023 14:01:08 +0000 Subject: [PATCH] Improve performance of fetching event reports when there are many of them --- synapse/storage/databases/main/room.py | 46 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/synapse/storage/databases/main/room.py b/synapse/storage/databases/main/room.py index ef26d5d9d3..851ed83caa 100644 --- a/synapse/storage/databases/main/room.py +++ b/synapse/storage/databases/main/room.py @@ -1600,25 +1600,37 @@ class RoomWorkerStore(CacheInvalidationWorkerStore): count = cast(Tuple[int], txn.fetchone())[0] sql = """ + WITH considered_event_reports AS ( + SELECT + er.id, + er.received_ts, + er.room_id, + er.event_id, + er.user_id, + er.content, + room_stats_state.canonical_alias, + room_stats_state.name + FROM event_reports AS er + JOIN room_stats_state + ON room_stats_state.room_id = er.room_id + {where_clause} + ORDER BY er.received_ts {order} + LIMIT ? + OFFSET ? + ) + -- only join on `events` after the LIMIT/OFFSET has been applied SELECT - er.id, - er.received_ts, - er.room_id, - er.event_id, - er.user_id, - er.content, + cer.id, + cer.received_ts, + cer.room_id, + cer.event_id, + cer.user_id, + cer.content, events.sender, - room_stats_state.canonical_alias, - room_stats_state.name - FROM event_reports AS er - LEFT JOIN events - ON events.event_id = er.event_id - JOIN room_stats_state - ON room_stats_state.room_id = er.room_id - {where_clause} - ORDER BY er.received_ts {order} - LIMIT ? - OFFSET ? + cer.canonical_alias, + cer.name + FROM considered_event_reports AS cer + LEFT JOIN events ON events.event_id = cer.event_id """.format( where_clause=where_clause, order=order,