From cfdd4a9b88ae2ec38a2766aaa3fd681620b46cac Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 4 Dec 2025 17:56:13 +0200 Subject: [PATCH] perf(coderd/database): add index on workspace_app_statuses.app_id (#21099) --- coderd/aitasks_test.go | 4 ++-- coderd/database/dump.sql | 2 ++ .../000402_workspace_app_statuses_app_id_index.down.sql | 1 + .../000402_workspace_app_statuses_app_id_index.up.sql | 1 + coderd/database/queries.sql.go | 1 + coderd/database/queries/workspaceapps.sql | 3 ++- 6 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 coderd/database/migrations/000402_workspace_app_statuses_app_id_index.down.sql create mode 100644 coderd/database/migrations/000402_workspace_app_statuses_app_id_index.up.sql diff --git a/coderd/aitasks_test.go b/coderd/aitasks_test.go index 3301f8bdd5..31bf04c0af 100644 --- a/coderd/aitasks_test.go +++ b/coderd/aitasks_test.go @@ -1680,8 +1680,8 @@ func TestTasksNotification(t *testing.T) { require.NoError(t, err) require.Len(t, workspaceAgent.Apps, 1) require.GreaterOrEqual(t, len(workspaceAgent.Apps[0].Statuses), 1) - latestStatusIndex := len(workspaceAgent.Apps[0].Statuses) - 1 - require.Equal(t, tc.newAppStatus, workspaceAgent.Apps[0].Statuses[latestStatusIndex].State) + // Statuses are ordered by created_at DESC, so the first element is the latest. + require.Equal(t, tc.newAppStatus, workspaceAgent.Apps[0].Statuses[0].State) if tc.isNotificationSent { // Then: A notification is sent to the workspace owner (memberUser) diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 7c06782459..64f6201712 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -3449,6 +3449,8 @@ COMMENT ON INDEX workspace_app_audit_sessions_unique_index IS 'Unique index to e CREATE INDEX workspace_app_stats_workspace_id_idx ON workspace_app_stats USING btree (workspace_id); +CREATE INDEX workspace_app_statuses_app_id_idx ON workspace_app_statuses USING btree (app_id, created_at DESC); + CREATE INDEX workspace_modules_created_at_idx ON workspace_modules USING btree (created_at); CREATE INDEX workspace_next_start_at_idx ON workspaces USING btree (next_start_at) WHERE (deleted = false); diff --git a/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.down.sql b/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.down.sql new file mode 100644 index 0000000000..5d1dddc8d9 --- /dev/null +++ b/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS workspace_app_statuses_app_id_idx; diff --git a/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.up.sql b/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.up.sql new file mode 100644 index 0000000000..f5caec6eff --- /dev/null +++ b/coderd/database/migrations/000402_workspace_app_statuses_app_id_index.up.sql @@ -0,0 +1 @@ +CREATE INDEX workspace_app_statuses_app_id_idx ON workspace_app_statuses (app_id, created_at DESC); diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index d1277ff945..17959e76a5 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -20246,6 +20246,7 @@ func (q *sqlQuerier) GetWorkspaceAppByAgentIDAndSlug(ctx context.Context, arg Ge const getWorkspaceAppStatusesByAppIDs = `-- name: GetWorkspaceAppStatusesByAppIDs :many SELECT id, created_at, agent_id, app_id, workspace_id, state, message, uri FROM workspace_app_statuses WHERE app_id = ANY($1 :: uuid [ ]) +ORDER BY created_at DESC, id DESC ` func (q *sqlQuerier) GetWorkspaceAppStatusesByAppIDs(ctx context.Context, ids []uuid.UUID) ([]WorkspaceAppStatus, error) { diff --git a/coderd/database/queries/workspaceapps.sql b/coderd/database/queries/workspaceapps.sql index b3694fb275..bf605f2cce 100644 --- a/coderd/database/queries/workspaceapps.sql +++ b/coderd/database/queries/workspaceapps.sql @@ -71,7 +71,8 @@ VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; -- name: GetWorkspaceAppStatusesByAppIDs :many -SELECT * FROM workspace_app_statuses WHERE app_id = ANY(@ids :: uuid [ ]); +SELECT * FROM workspace_app_statuses WHERE app_id = ANY(@ids :: uuid [ ]) +ORDER BY created_at DESC, id DESC; -- name: GetLatestWorkspaceAppStatusByAppID :one SELECT *