fix: performance issues

This commit is contained in:
nate 2026-04-08 14:25:29 +04:00
parent 9940453731
commit 530e37c581
1 changed files with 20 additions and 24 deletions

View File

@ -186,33 +186,29 @@ export const dashboard = new Elysia()
if (!accountId) return redirect("/dashboard"); if (!accountId) return redirect("/dashboard");
const monitors = await sql` const monitors = await sql`
SELECT m.*, ( SELECT * FROM monitors WHERE account_id = ${accountId} ORDER BY created_at DESC
SELECT row_to_json(p) FROM pings p
WHERE p.monitor_id = m.id ORDER BY p.checked_at DESC LIMIT 1
) as last_ping
FROM monitors m WHERE m.account_id = ${accountId}
ORDER BY m.created_at DESC
`; `;
const monitorIds = monitors.map((m: any) => m.id); // One simple indexed query per monitor, run in parallel. Each is an index
let pingsMap: Record<string, any[]> = {}; // seek on (monitor_id, checked_at DESC) — microseconds. Trivially scalable
if (monitorIds.length > 0) { // and easy to reason about.
const allPings = await sql` const pingResults = await Promise.all(
SELECT * FROM ( monitors.map((m: any) => sql`
SELECT p.*, ROW_NUMBER() OVER (PARTITION BY p.monitor_id, COALESCE(p.region,'__none__') ORDER BY p.checked_at DESC) as rn SELECT * FROM pings
FROM pings p WHERE p.monitor_id = ANY(${monitorIds}) WHERE monitor_id = ${m.id}
) sub WHERE rn <= 20 ORDER BY monitor_id, checked_at ASC ORDER BY checked_at DESC
`; LIMIT 20
for (const p of allPings) { `)
if (!pingsMap[p.monitor_id]) pingsMap[p.monitor_id] = []; );
pingsMap[p.monitor_id].push(p);
}
}
const monitorsWithPings = monitors.map((m: any) => ({ const monitorsWithPings = monitors.map((m: any, i: number) => {
...m, const recent = pingResults[i] as any[]; // DESC order
pings: pingsMap[m.id] || [], return {
})); ...m,
last_ping: recent[0] ?? null,
pings: recent.slice().reverse(), // sparkline expects chronological ASC
};
});
return html("home", { nav: "monitors", monitors: monitorsWithPings, accountId }); return html("home", { nav: "monitors", monitors: monitorsWithPings, accountId });
}) })