xarmian
48104a5eff
perf(server): collapse dashboard/bootstrap N+1 into set-based queries (BUG-2002) ( #847 )
...
The dashboard builder (also reused by the bootstrap endpoint and every
pad_set_workspace) ran ~1000 queries on a large workspace: one
GetItemLinks + per-link GetItem for every non-done item (blocked
attention + suggested_next filter), a GetChildItems per active plan
(progress + suggested_next), a GetItemIncludeDeleted per recent-activity
row, a GetCollection per visible collection, and a per-collection COUNT
via ListCollections whose result the dashboard never uses.
Replace every per-item/per-row loop with a set-based query:
- GetBlocksEdges: one workspace-wide JOIN of blocks-links -> blocker
essentials, ordered created_at DESC to preserve the old first-active-
blocker selection. Drives both blocked attention and the suggested_next
blocked-filter (retires itemBlockedByActive).
- GetChildItemsForParents: one IN query grouping all active-plan children
by parent (progress + suggested_next; no-content projection).
- GetItemsByIDsIncludeDeleted: one IN query batch-hydrating recent-activity
items (include-deleted).
- ListItemsParams.NoContent: skip loading full markdown bodies on the
count/summary scans (allItems, plans, stalled, orphaned).
- ListCollectionsMinimal now also selects slug; the dashboard uses it in
place of ListCollections, dropping the unused per-collection COUNT N+1
and the GetCollection-per-visible-id loop.
Per-item N+1s are gone; query count is now constant in workspace size.
Verified byte-identical dashboard + bootstrap JSON against three live
workspaces (docapp/claude/apm); dashboard latency ~376ms -> ~198ms on the
1907-item docapp workspace. New store methods are unit-tested.
2026-07-07 17:18:54 -04:00
..
2026-04-29 15:41:12 -04:00
2026-06-22 11:43:52 -04:00
2026-05-06 08:40:11 -04:00
2026-05-06 13:27:12 -04:00
2026-06-15 14:44:58 -04:00
2026-05-18 00:43:46 -04:00
2026-05-18 00:43:46 -04:00
2026-04-28 12:26:39 -04:00
2026-05-02 22:56:10 -04:00
2026-04-25 11:35:19 -04:00
2026-04-25 11:35:19 -04:00
2026-04-28 12:26:39 -04:00
2026-07-05 20:47:30 -04:00
2026-07-04 14:38:01 -04:00
2026-07-05 20:47:30 -04:00
2026-07-05 19:58:07 -04:00
2026-06-29 13:07:36 -05:00
2026-05-27 10:09:30 -04:00
2026-04-28 12:26:39 -04:00
2026-04-28 12:26:39 -04:00
2026-04-28 16:21:43 -04:00
2026-07-01 17:44:43 -04:00
2026-07-04 04:15:09 -04:00
2026-07-04 04:15:09 -04:00
2026-07-01 17:44:43 -04:00
2026-04-28 12:26:39 -04:00
2026-06-27 21:42:52 -05:00
2026-06-22 13:31:45 -04:00
2026-06-22 13:31:45 -04:00
2026-04-29 15:41:12 -04:00
2026-05-31 11:39:02 -04:00
2026-04-29 14:35:49 -04:00
2026-04-29 19:25:55 -04:00
2026-04-29 15:02:07 -04:00
2026-04-29 19:25:55 -04:00
2026-05-31 11:39:02 -04:00
2026-04-28 12:26:39 -04:00
2026-05-06 13:27:12 -04:00
2026-05-06 08:40:11 -04:00
2026-06-22 20:58:50 -04:00
2026-04-21 19:33:47 -04:00
2026-04-21 20:52:03 -04:00
2026-04-22 12:21:34 -04:00
2026-07-05 18:44:26 -04:00
2026-07-05 18:44:26 -04:00
2026-05-27 10:37:30 -04:00
2026-06-27 21:42:52 -05:00
2026-07-03 14:40:54 -04:00
2026-06-21 12:25:46 -04:00
2026-04-29 14:35:49 -04:00
2026-04-25 11:53:31 -04:00
2026-05-18 15:25:27 -04:00
2026-07-05 12:05:24 -04:00
2026-04-22 09:27:45 -04:00
2026-06-20 23:51:43 -04:00
2026-07-04 11:33:18 -04:00
2026-07-04 11:33:18 -04:00
2026-05-09 21:45:46 -04:00
2026-07-04 02:06:58 -04:00
2026-07-03 18:12:35 -04:00
2026-07-03 03:27:04 -04:00
2026-07-03 18:12:35 -04:00
2026-07-03 18:24:36 -04:00
2026-05-30 12:38:57 -04:00
2026-07-03 18:24:36 -04:00
2026-05-18 08:33:39 -04:00
2026-05-18 03:32:42 -04:00
2026-05-18 08:33:39 -04:00
2026-05-21 13:08:02 -04:00
2026-07-03 14:40:54 -04:00
2026-07-07 17:18:54 -04:00
2026-05-14 22:10:12 -04:00
2026-05-20 16:39:23 -04:00
2026-05-30 18:41:55 -04:00
2026-04-28 12:26:39 -04:00
2026-05-18 18:29:28 -04:00
2026-05-30 18:41:55 -04:00
2026-04-29 18:30:43 -04:00
2026-07-04 13:54:08 -04:00
2026-07-04 13:54:08 -04:00
2026-07-03 20:18:29 -04:00
2026-07-03 20:18:29 -04:00
2026-07-03 14:40:54 -04:00
2026-06-08 18:13:10 -04:00
2026-04-29 22:03:27 -04:00
2026-04-29 20:24:25 -04:00
2026-05-15 00:36:41 -04:00
2026-05-15 00:36:41 -04:00
2026-07-03 23:47:06 -04:00
2026-04-28 12:26:39 -04:00
2026-06-27 21:42:52 -05:00
2026-06-27 21:42:52 -05:00
2026-07-03 15:31:17 -04:00
2026-07-03 15:31:17 -04:00
2026-05-09 21:45:46 -04:00
2026-05-16 10:15:59 -04:00
2026-05-30 19:57:45 -04:00
2026-05-27 13:21:57 -04:00
2026-05-17 00:15:52 -04:00
2026-07-03 15:31:17 -04:00
2026-07-07 16:45:00 -04:00
2026-05-21 16:59:57 -04:00
2026-05-21 16:59:57 -04:00
2026-05-02 22:56:10 -04:00
2026-05-02 22:56:10 -04:00
2026-05-14 15:45:51 -04:00
2026-06-24 22:45:32 -04:00
2026-06-24 22:45:32 -04:00
2026-05-05 08:52:05 -04:00
2026-05-05 08:52:05 -04:00
2026-07-04 14:39:33 -04:00
2026-07-04 14:39:33 -04:00
2026-05-18 00:43:46 -04:00
2026-05-18 00:43:46 -04:00
2026-05-02 13:33:53 -04:00
2026-07-04 11:33:18 -04:00
2026-05-18 17:17:42 -04:00
2026-07-04 02:06:58 -04:00
2026-05-21 13:08:02 -04:00
2026-05-12 18:29:11 -04:00
2026-05-12 18:29:11 -04:00
2026-07-03 22:29:40 -04:00
2026-07-03 22:29:40 -04:00
2026-04-28 12:26:39 -04:00
2026-07-03 15:31:17 -04:00
2026-07-03 15:31:17 -04:00
2026-05-29 08:24:05 -04:00
2026-05-29 17:47:25 -04:00
2026-04-28 12:26:39 -04:00
2026-04-28 12:26:39 -04:00
2026-06-02 09:39:22 -04:00
2026-07-03 19:41:57 -04:00
2026-05-02 21:31:48 -04:00
2026-06-27 21:42:52 -05:00
2026-04-29 17:44:12 -04:00
2026-04-30 16:06:08 -04:00
2026-05-29 23:43:02 -04:00
2026-06-01 21:25:42 -04:00
2026-06-27 21:42:52 -05:00
2026-04-28 12:26:39 -04:00
2026-04-21 22:53:27 -04:00
2026-04-28 12:26:39 -04:00
2026-07-04 03:32:48 -04:00
2026-04-28 12:26:39 -04:00
2026-05-16 10:15:59 -04:00
2026-05-16 10:15:59 -04:00
2026-04-28 12:26:39 -04:00
2026-06-24 22:28:34 -04:00
2026-05-02 18:36:55 -04:00
2026-05-25 11:46:41 -04:00
2026-07-06 10:07:34 -04:00
2026-07-06 10:07:34 -04:00
2026-07-07 16:51:48 -04:00
2026-07-03 10:15:49 -04:00
2026-07-03 12:17:03 -04:00
2026-05-27 10:09:30 -04:00
2026-05-07 20:01:34 -04:00
2026-07-04 11:33:18 -04:00
2026-07-04 11:33:18 -04:00
2026-07-04 11:33:18 -04:00
2026-05-06 08:40:11 -04:00
2026-05-06 08:40:11 -04:00
2026-05-14 15:45:51 -04:00
2026-05-03 17:40:18 -04:00
2026-05-18 00:03:20 -04:00
2026-05-18 00:03:20 -04:00
2026-05-03 17:40:18 -04:00
2026-05-03 17:40:18 -04:00
2026-05-03 17:40:18 -04:00
2026-04-28 12:26:39 -04:00
2026-04-28 12:26:39 -04:00
2026-04-05 10:26:00 -04:00
2026-07-04 03:32:48 -04:00
2026-04-25 11:35:19 -04:00
2026-04-21 19:33:47 -04:00
2026-04-25 11:35:19 -04:00
2026-04-21 23:59:54 -04:00
2026-04-28 12:26:39 -04:00
2026-07-04 02:06:58 -04:00
2026-07-04 02:06:58 -04:00
2026-05-09 18:19:33 -04:00
2026-05-09 18:19:33 -04:00
2026-05-30 10:57:31 -04:00
2026-05-30 10:57:31 -04:00
2026-04-22 12:21:34 -04:00
2026-04-22 12:21:34 -04:00
2026-07-03 10:15:49 -04:00
2026-07-06 10:07:34 -04:00
2026-05-09 07:13:10 -04:00
2026-04-29 14:35:49 -04:00
2026-04-29 14:35:49 -04:00
2026-07-04 01:19:41 -04:00
2026-07-04 01:19:41 -04:00
2026-05-02 13:33:53 -04:00
2026-05-02 14:29:17 -04:00
2026-04-08 20:30:39 +00:00
2026-04-10 23:12:59 +00:00
2026-07-05 22:23:12 -04:00
2026-07-06 10:07:34 -04:00