Sziasztok.
Van egy szép nagy programom, egy összetettre sikerült PostgreSQL adatbázissal: https://github.com/csikfer/lanview2
Elboldogulok úgy általában az SQL-lel, de nem vagyok guru a témában.
Van egy lekérdezés a programba, ami irreálisan lassú. A lekérdezés 4 másodperc, miközben egy teljesen üres táblát kérdez le. Azt érzem, hogy a query messze nem optimális, de a semmin mit lehet molyolni 4 másodpercig, még ha balfasz módon fogalmaztam is meg a kérdést? És persze akkor is sok lesz ez a (több mint) 4 másodperc, ha lesz adat is a táblában, márpedig lehet benne sok rekord.
A query :
SELECT NULL,* FROM ONLY view_alarms WHERE array_length(ack_user_ids, 1) IS NULL AND is_group_place(place_id, ?) AND user_is_any_groups_member(?,online_group_ids);
A view_alarm egy VIEW tábla, amin szerintem van mit finomítani:
CREATE VIEW view_alarms AS
SELECT
a.alarm_id AS view_alarm_id,
a.host_service_id,
hs.node_id,
n.place_id,
a.superior_alarm_id,
a.begin_time,
a.end_time,
a.first_status,
a.max_status,
a.last_status,
alarm_message(host_service_id, max_status) AS msg,
COALESCE(hs.offline_group_ids, s.offline_group_ids) AS offline_group_ids,
COALESCE(hs.online_group_ids, s.online_group_ids) AS online_group_ids,
ARRAY(SELECT user_id FROM user_events WHERE alarm_id = a.alarm_id AND event_type = 'notice') AS notice_user_ids,
ARRAY(SELECT user_id FROM user_events WHERE alarm_id = a.alarm_id AND event_type = 'view') AS view_user_ids,
ARRAY(SELECT user_id FROM user_events WHERE alarm_id = a.alarm_id AND event_type = 'acknowledge') AS ack_user_ids,
ARRAY(SELECT user_id FROM user_events WHERE alarm_id = a.alarm_id AND event_type = 'sendmessage') AS msg_user_ids,
ARRAY(SELECT user_id FROM user_events WHERE alarm_id = a.alarm_id AND event_type = 'sendmail') AS mail_user_ids
FROM alarms AS a
JOIN host_services AS hs USING(host_service_id)
JOIN services AS s USING(service_id)
JOIN nodes AS n USING(node_id)
WHERE NOT a.noalarm;
Az alarms rekordból lehet viszonylag sok is, és fontos lenne, hogy max. 1-2 másodperc alatt lefusson. Elvileg a lekérdezés eredménye néhány sor, de nem kéne kiakadnia a programnak, ha pl. pár száz sor lenne.
A VIEW-ben hozzácsapom a táblához a felhasználói eseményeket (Megjelent a programban a riasztás, megnézte a részleteit, nyugtázta) ezek mint ID tömbök kerülnek a VIEW-ba. Valamint bekerül a VIEW-be a riasztás helye, milyen szolgáltatás, melyik eszközön riasztott.
A query-ben szűrök arra, hogy a riasztás a megfelelő zónában volt-e, az aktuális felhasználó benne van-e a csoportban, melyeknek on-line riasztást kell adni, és hogy nyugtázta-e már valaki ezt a riasztást.
Hogyan lehetne optimalizálni a fenti lekérdezést (további infók a linkben)?