Browse Source

Speed up pruning of `user_ips` table (#16667)

Silly query planner
tags/v1.98.0rc1
Erik Johnston 5 months ago
committed by GitHub
parent
commit
df366966b4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 10 deletions
  1. +1
    -0
      changelog.d/16667.misc
  2. +7
    -10
      synapse/storage/databases/main/client_ips.py

+ 1
- 0
changelog.d/16667.misc View File

@@ -0,0 +1 @@
Reduce database load of pruning old `user_ips`.

+ 7
- 10
synapse/storage/databases/main/client_ips.py View File

@@ -465,18 +465,15 @@ class ClientIpWorkerStore(ClientIpBackgroundUpdateStore, MonthlyActiveUsersWorke
#
# This works by finding the max last_seen that is less than the given
# time, but has no more than N rows before it, deleting all rows with
# a lesser last_seen time. (We COALESCE so that the sub-SELECT always
# returns exactly one row).
# a lesser last_seen time. (We use an `IN` clause to force postgres to
# use the index, otherwise it tends to do a seq scan).
sql = """
DELETE FROM user_ips
WHERE last_seen <= (
SELECT COALESCE(MAX(last_seen), -1)
FROM (
SELECT last_seen FROM user_ips
WHERE last_seen <= ?
ORDER BY last_seen ASC
LIMIT 5000
) AS u
WHERE last_seen IN (
SELECT last_seen FROM user_ips
WHERE last_seen <= ?
ORDER BY last_seen ASC
LIMIT 5000
)
"""



Loading…
Cancel
Save