Postgres يستهلك 100% CPU لقواعد البيانات الكبيرة، Discourse 2.7.7

مرحباً،

نقوم بتشغيل Discourse 2.7.7 المعتمد على Docker مع قاعدة مستخدمين ضخمة. بعد الترقية من الإصدار 2.4.2 إلى 2.7.7، نواجه مشكلة حيث تعلق بعض عمليات Postgres عند استهلاك 100% من وحدة المعالجة المركزية. وأظهرت التحقيقات الإضافية أن الاستعلامات التالية تبدو هي المسبب للمشكلة:

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)

لقد عثرنا على هذا الاستعلام، وأعتقد أنه سيسبب عبئاً هائلاً، أليس كذلك؟

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

هل لديكم أي اقتراحات بخصوص ذلك؟
أخبروني إذا كنتم بحاجة إلى مزيد من المعلومات.

شكراً لكم،
دانيال.

يبدو أن هذا الاستعلام قادم من Jobs::BadgeGrant.

لقد اكتشفنا أن المشكلة سببها استعلام SQL مخصص في شارة مستخدم. إذن هذه ليست مشكلة في المصدر الأعلى. شكرًا لك.

أعتقد أنك ستريد أيضًا التأكد من إجراء عملية التنظيف وإعادة الفهرسة كما هو موضح في تحديث PostgreSQL 13.