2 files changed, 10 insertions, 5 deletions
diff --git a/changelog.d/15861.misc b/changelog.d/15861.misc
new file mode 100644
index 0000000000..6f320eab81
--- /dev/null
+++ b/changelog.d/15861.misc
@@ -0,0 +1 @@
+Optimised cleanup of old entries in device_lists_stream.
diff --git a/synapse/storage/databases/main/devices.py b/synapse/storage/databases/main/devices.py
index f677d048aa..d9df437e51 100644
--- a/synapse/storage/databases/main/devices.py
+++ b/synapse/storage/databases/main/devices.py
@@ -1950,12 +1950,16 @@ class DeviceStore(DeviceWorkerStore, DeviceBackgroundUpdateStore):
# Delete older entries in the table, as we really only care about
# when the latest change happened.
- txn.execute_batch(
- """
+ cleanup_obsolete_stmt = """
DELETE FROM device_lists_stream
- WHERE user_id = ? AND device_id = ? AND stream_id < ?
- """,
- [(user_id, device_id, min_stream_id) for device_id in device_ids],
+ WHERE user_id = ? AND stream_id < ? AND %s
+ """
+ device_ids_clause, device_ids_args = make_in_list_sql_clause(
+ txn.database_engine, "device_id", device_ids
+ )
+ txn.execute(
+ cleanup_obsolete_stmt % (device_ids_clause,),
+ [user_id, min_stream_id] + device_ids_args,
)
self.db_pool.simple_insert_many_txn(
|