Postgres al 100% de CPU con bases de datos grandes, Discourse 2.7.7

Hola,

Estamos ejecutando Discourse 2.7.7 basado en Docker con una base de usuarios muy grande. Después de actualizar de la versión 2.4.2 a la 2.7.7, estamos experimentando que algunos procesos de Postgres se quedan atascados al 100% de CPU. Una investigación más detallada revela que parecen ser estas consultas las que causan el problema:

discourse_prod=# select pid, datid, query from pg_stat_activity WHERE pid = '244906';
  pid   |  datid  |                         query
--------+---------+-------------------------------------------------------
 244906 | 2068583 | DELETE FROM user_badges                              +
        |         |   WHERE id IN (                                      +
        |         |     SELECT ub.id                                     +
        |         |     FROM user_badges ub                              +
        |         |     LEFT JOIN (                                      +
        |         |       SELECT id user_id, current_timestamp granted_at+
        |         | FROM users                                           +
        |         | WHERE id  IN (                                       +
        |         |        SELECT p1.user_id                             +
        |         |        FROM post_custom_fields pc                    +
        |         |        JOIN badge_posts p1 ON p1.id = pc.post_id     +
        |         |        JOIN topics t1 ON p1.topic_id = t1.id         +
        |         |        WHERE p1.user_id <> t1.user_id AND            +
        |         |                     name = 'is_accepted_answer' AND  +
        |         |             p1.user_id IN (                          +
        |         |                    SELECT user_id                    +
        |         |                    FROM posts                        +
        |         |                    WHERE TRUE OR  p1.id IN (-1)      +
        |         |             )                                        +
        |         |         GROUP BY p1.user_id                          +
        |         |         HAVING COUNT(*) > 9                          +
        |         | )                                                    +
        |         |     ) q ON q.user_id = ub.user_id                    +
        |         |                                                      +
        |         |     WHERE ub.badge_id = 103 AND q.user_id IS NULL    +
        |         |   )                                                  +
        |         |
(1 row)

Encontramos esta consulta que, asumo, causará una gran sobrecarga, ¿verdad?

        |         |                    SELECT user_id                    +
        |         |                    FROM posts                        +
        |         |                    WHERE TRUE OR  p1.id IN (-1)      +

¿Alguna sugerencia al respecto?
Avíseme si necesita más información.

Gracias,
Daniel.

Esta consulta parece provenir de Jobs::BadgeGrant.

Hemos identificado que el problema fue causado por una consulta SQL personalizada en una insignia de usuario. Por lo tanto, no se trata de un problema externo. Gracias.

Sospecho que también querrás asegurarte de ejecutar vacuum y reindexar como se describe en Actualización de PostgreSQL 13.