Probléma:
Úgy általánosságban nem használunk *-ot lekérdezésekben, maximum, amikor feltérképezzük a táblát.
Másrészt valószínűleg az ARRAY-ben szereplő lekérdezéseket futtatja le a buta először, az eredményeket letárolja temp táblákban (ha van elég intelligens a query optimizer, akkor összehúzza egy lekérdezésbe). Ha elég népes a user_events tábla, esetleg nincs index az event_type mezőn (talán az alarm_id + event_type mezőn még jobb lenne), vagy van, de rossz a selectivitása, akkor azon bizony el fog molyolni a storage engine anélkül, hogy egyetlen rekordot is visszaadna.
Majdnem jó megoldás:
Az ARRAY függvényekben lévő lekérdezést át kellene írni úgy, hogy mindegyik függvényben ugyanaz a lekérdezés legyen: SELECT user_id, event_type FROM user_events WHERE alarm_id = a.alarm_id, majd egy case when-nel elágaztatni event_type-ra szűrve. Pontosan most nem tudom kifejteni, hogy hogyan, de az a lényeg, hogy ezt a lekérdezést már csak egyszer fogja lefuttatni az öt helyett és cache-be vágja az eredményt.
Egész jó megoldás:
A user_events táblát joinolod a lekérdezésben és megint csak case when-nel szűröd az event_type-ot. Az nem tudom, mennyivel jobb, ha a user_events táblát ötször joinolod hozzá a join feltételben szűrve event_type-ra, ebben az esetben nem kell a case when ugye. Explain-t futtass mindkét verzióra és használd a jobbat.
A teljesen tuti megoldást valszeg egy postgre guru fogja megmondani.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"