Abfrage verursacht 400% CPU Load

Wir haben kürzlich ALLE Erwähnungen gelöscht und seitdem ist die CPU-Auslastung auf 15-20% gesunken, also ziemlich gut, aber daher wird die obige Abfrage keine Ergebnisse mehr liefern. (oder nur wenige, da wir sie gelöscht haben)

1 „Gefällt mir“

Die obige Abfrage sollte in jedem Fall Ergebnisse zurückgeben, sie beginnt mit EXPLAIN VERBOSE, daher gibt sie einen Ausführungsplan zurück. Wenn Sie Zeit haben, könnten Sie bitte die genaue Abfrage aus meiner Nachricht kopieren und einfügen, ausführen und die Ergebnisse mitteilen?

Limit  (Kosten=123.37..22204.48 Zeilen=1000 Breite=40)
   Ausgabe: users.id, (array_agg(ARRAY[uccm.id, c_msg.id])), uccm.user_id
   ->  GroupAggregate  (Kosten=123.37..339399.59 Zeilen=15365 Breite=40)
         Ausgabe: users.id, array_agg(ARRAY[uccm.id, c_msg.id]), uccm.user_id
         Group Key: users.id, uccm.user_id
         ->  Nested Loop  (Kosten=123.37..336077.65 Zeilen=417317 Breite=24)
               Ausgabe: users.id, uccm.user_id, uccm.id, c_msg.id
               Inner Unique: true
               ->  Merge Join  (Kosten=123.23..271629.01 Zeilen=417317 Breite=28)
                     Ausgabe: users.id, group_users.group_id, uccm.id, uccm.user_id, c_msg.id
                     Merge Cond: (user_options.user_id = group_users.user_id)
                     ->  Nested Loop Left Join  (Kosten=121.72..221430.16 Zeilen=132835 Breite=28)
                           Ausgabe: users.id, user_options.user_id, uccm.id, uccm.user_id, c_msg.id
                           Filter: (((uccm.user_id = c_mentions.user_id) AND (uccm.following IS TRUE) AND ((cc.chatable_type)::text = 'Category'::text)) OR ((cc.chatable_type)::text = 'DirectMessage'::text))
                           ->  Nested Loop  (Kosten=121.32..149930.76 Zeilen=132967 Breite=42)
                                 Ausgabe: users.id, user_options.user_id, uccm.id, uccm.user_id, uccm.following, cc.chatable_type, c_msg.id
                                 Join Filter: ((c_msg.user_id <> users.id) AND (cc.id = c_msg.chat_channel_id))
                                 ->  Nested Loop  (Kosten=120.91..57868.92 Zeilen=21066 Breite=54)
                                       Ausgabe: users.id, user_options.user_id, uccm.id, uccm.user_id, uccm.chat_channel_id, uccm.last_read_message_id, uccm.last_unread_mention_when_emailed_id, uccm.following, cc.id, cc.chatable_type
                                       Inner Unique: true
                                       ->  Nested Loop  (Kosten=120.63..51231.73 Zeilen=21066 Breite=33)
                                             Ausgabe: users.id, user_options.user_id, uccm.id, uccm.user_id, uccm.chat_channel_id, uccm.last_read_message_id, uccm.last_unread_mention_when_emailed_id, uccm.following
                                             Inner Unique: true
                                             ->  Merge Join  (Kosten=120.21..36835.88 Zeilen=21096 Breite=29)
                                                   Ausgabe: users.id, uccm.id, uccm.user_id, uccm.chat_channel_id, uccm.last_read_message_id, uccm.last_unread_mention_when_emailed_id, uccm.following
                                                   Inner Unique: true
                                                   Merge Cond: (uccm.user_id = users.id)
                                                   ->  Index Scan using user_chat_channel_unique_memberships on public.user_chat_channel_memberships uccm  (Kosten=0.41..12177.25 Zeilen=21618 Breite=25)
                                                         Ausgabe: uccm.id, uccm.user_id, uccm.chat_channel_id, uccm.last_read_message_id, uccm.following, uccm.muted, uccm.desktop_notification_level, uccm.mobile_notification_level, uccm.created_at, uccm.updated_at, uccm.last_unread_mention_when_emailed_id, uccm.join_mode, uccm.last_viewed_at
                                                   ->  Index Scan using users_pkey on public.users  (Kosten=0.42..23823.53 Zeilen=237544 Breite=4)
                                                         Ausgabe: users.id
                                                         Filter: (users.last_seen_at < '2023-11-27 08:00:00'::timestamp without time zone)
                                             ->  Index Scan using index_user_options_on_user_id on public.user_options  (Kosten=0.42..0.68 Zeilen=1 Breite=4)
                                                   Ausgabe: user_options.user_id
                                                   Index Cond: (user_options.user_id = users.id)
                                                   Filter: (user_options.chat_enabled AND (user_options.chat_email_frequency = 1))
                                       ->  Index Scan using chat_channels_pkey on public.chat_channels cc  (Kosten=0.28..0.32 Zeilen=1 Breite=21)
                                             Ausgabe: cc.id, cc.chatable_id, cc.deleted_at, cc.deleted_by_id, cc.featured_in_category_id, cc.delete_after_seconds, cc.chatable_type, cc.created_at, cc.updated_at, cc.name, cc.description, cc.status, cc.user_count, cc.last_message_sent_at, cc.auto_join_users, cc.user_count_stale, cc.type, cc.slug, cc.allow_channel_wide_mentions, cc.messages_count, cc.threading_enabled, cc.last_message_id
                                             Index Cond: (cc.id = uccm.chat_channel_id)
                                 ->  Index Scan using index_chat_messages_on_chat_channel_id_and_created_at on public.chat_messages c_msg  (Kosten=0.41..4.19 Zeilen=12 Breite=16)
                                       Ausgabe: c_msg.id, c_msg.chat_channel_id, c_msg.user_id
                                       Index Cond: ((c_msg.chat_channel_id = uccm.chat_channel_id) AND (c_msg.created_at > '2023-11-20 08:00:00'::timestamp without time zone))
                                       Filter: ((c_msg.deleted_at IS NULL) AND ((uccm.last_read_message_id IS NULL) OR (c_msg.id > uccm.last_read_message_id)) AND ((uccm.last_unread_mention_when_emailed_id IS NULL) OR (c_msg.id > uccm.last_unread_mention_when_emailed_id)))
                           ->  Index Only Scan using chat_mentions_index on public.chat_mentions c_mentions  (Kosten=0.40..0.52 Zeilen=1 Breite=8)
                                 Ausgabe: c_mentions.chat_message_id, c_mentions.user_id, c_mentions.notification_id
                                 Index Cond: (c_mentions.chat_message_id = c_msg.id)
                     ->  Index Only Scan using index_group_users_on_user_id_and_group_id on public.group_users  (Kosten=0.42..44019.59 Zeilen=760157 Breite=8)
                           Ausgabe: group_users.user_id, group_users.group_id
               ->  Index Only Scan using groups_pkey on public.groups  (Kosten=0.14..0.16 Zeilen=1 Breite=4)
  Ausgabe: groups.id
                     Index Cond: (groups.id = group_users.group_id)

(51 Zeilen)

2 „Gefällt mir“

@sok777 vielen Dank für das Teilen des Abfrageplans! Er ist sehr hilfreich.

Ihre Instanz enthält eine große Anzahl von Benutzern und eine große Anzahl von user_chat_channel_memberships-Datensätzen (wie Sie hier geteilt haben).

Bevor Sie den Testplan geteilt haben, habe ich versucht, das Problem auf Websites mit einer großen Anzahl von Benutzern zu reproduzieren, aber die Abfrage funktionierte gut. Jetzt sehe ich, dass diese Websites keine große Anzahl von user_chat_channel_memberships haben. Sehr wahrscheinlich ist dies das Spezifische an Ihrer Website und die Ursache für die so ernsten Probleme in Ihrem Fall.

Soweit ich weiß, haben Sie jetzt keine Probleme mehr, da Sie irgendwann alle Erwähnungen entfernt haben. Ich würde jedoch erwarten, dass diese Abfrage irgendwann wieder problematisch wird, selbst bei einer geringen Anzahl von Erwähnungen. Daher werde ich sie auf jeden Fall optimieren.

Ich arbeite derzeit daran, das zugrunde liegende Problem zu beheben, das die Erstellung riesiger Mengen von chat_mention-Datensätzen in der Datenbank verursacht hat. Währenddessen ist es wichtig, @ all und @ here in den beobachteten Wörtern zu behalten. Ich werde hier ein Update posten, wenn ich mich darum gekümmert habe, und danach werde ich sicherstellen, diese Abfrage zu optimieren.

6 „Gefällt mir“

Das zugrunde liegende Problem wurde behoben durch

Es sollte keine solchen Leistungsprobleme mehr geben, und es ist nicht notwendig, Massenerwähnungen in beobachteten Wörtern beizubehalten.

Bezüglich dessen:

Es scheint keine Beschwerden über diese Abfrage zu geben, daher habe ich sie nicht optimiert. Bitte zögern Sie nicht, sich bei Problemen zu melden.

5 „Gefällt mir“