PERF: Reduce records queried in UserStat.update_first_unread_pm. (#15016)

The inefficiency here is that we were previously fetching all the
records from `TopicAllowedUser` before filtering against a limited subset of
users based on `User#last_seen_at`.
This commit is contained in:
Alan Guo Xiang Tan 2021-11-19 12:30:39 +08:00 committed by GitHub
parent da9a9a8e65
commit 4b4973ee0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -22,10 +22,6 @@ class UserStat < ActiveRecord::Base
DB.exec(<<~SQL, archetype: Archetype.private_message, now: UPDATE_UNREAD_MINUTES_AGO.minutes.ago, last_seen: last_seen, limit: limit)
UPDATE user_stats us
SET first_unread_pm_at = COALESCE(Z.min_date, :now)
FROM (
SELECT
Y.user_id,
Y.min_date
FROM (
SELECT
u1.id user_id,
@ -47,10 +43,7 @@ class UserStat < ActiveRecord::Base
ELSE t.highest_post_number
END
AND (COALESCE(tu.notification_level, 1) >= 2)
GROUP BY tau.user_id
) AS X ON X.user_id = u1.id
) AS Y
WHERE Y.user_id IN (
AND tau.user_id IN (
SELECT id
FROM users
WHERE last_seen_at IS NOT NULL
@ -58,6 +51,8 @@ class UserStat < ActiveRecord::Base
ORDER BY last_seen_at DESC
LIMIT :limit
)
GROUP BY tau.user_id
) AS X ON X.user_id = u1.id
) AS Z
WHERE us.user_id = Z.user_id
SQL