From 9811abe1f09a259f2119b9d59455eb2f8d428c3a Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Tue, 13 May 2025 11:02:50 +0000 Subject: [PATCH 1/3] chore: optimize workspace_latest_builds view query --- coderd/database/dump.sql | 77 ++++++++++------- ...kspace_latest_builds_optimization.down.sql | 58 +++++++++++++ ...orkspace_latest_builds_optimization.up.sql | 85 +++++++++++++++++++ 3 files changed, 188 insertions(+), 32 deletions(-) create mode 100644 coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql create mode 100644 coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index fa5b4b821cf0c..a03ea910f937c 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -2024,18 +2024,52 @@ CREATE VIEW workspace_build_with_user AS COMMENT ON VIEW workspace_build_with_user IS 'Joins in the username + avatar url of the initiated by user.'; +CREATE TABLE workspaces ( + id uuid NOT NULL, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + owner_id uuid NOT NULL, + organization_id uuid NOT NULL, + template_id uuid NOT NULL, + deleted boolean DEFAULT false NOT NULL, + name character varying(64) NOT NULL, + autostart_schedule text, + ttl bigint, + last_used_at timestamp with time zone DEFAULT '0001-01-01 00:00:00+00'::timestamp with time zone NOT NULL, + dormant_at timestamp with time zone, + deleting_at timestamp with time zone, + automatic_updates automatic_updates DEFAULT 'never'::automatic_updates NOT NULL, + favorite boolean DEFAULT false NOT NULL, + next_start_at timestamp with time zone +); + +COMMENT ON COLUMN workspaces.favorite IS 'Favorite is true if the workspace owner has favorited the workspace.'; + CREATE VIEW workspace_latest_builds AS - SELECT DISTINCT ON (wb.workspace_id) wb.id, - wb.workspace_id, - wb.template_version_id, - wb.job_id, - wb.template_version_preset_id, - wb.transition, - wb.created_at, - pj.job_status - FROM (workspace_builds wb - JOIN provisioner_jobs pj ON ((wb.job_id = pj.id))) - ORDER BY wb.workspace_id, wb.build_number DESC; + SELECT latest_build.id, + latest_build.workspace_id, + latest_build.template_version_id, + latest_build.job_id, + latest_build.template_version_preset_id, + latest_build.transition, + latest_build.created_at, + latest_build.job_status + FROM (workspaces + LEFT JOIN LATERAL ( SELECT workspace_builds.id, + workspace_builds.workspace_id, + workspace_builds.template_version_id, + workspace_builds.job_id, + workspace_builds.template_version_preset_id, + workspace_builds.transition, + workspace_builds.created_at, + provisioner_jobs.job_status + FROM (workspace_builds + JOIN provisioner_jobs ON ((provisioner_jobs.id = workspace_builds.job_id))) + WHERE (workspace_builds.workspace_id = workspaces.id) + ORDER BY workspace_builds.build_number DESC + LIMIT 1) latest_build ON (true)) + WHERE (workspaces.deleted = false) + ORDER BY workspaces.id; CREATE TABLE workspace_modules ( id uuid NOT NULL, @@ -2072,27 +2106,6 @@ CREATE TABLE workspace_resources ( module_path text ); -CREATE TABLE workspaces ( - id uuid NOT NULL, - created_at timestamp with time zone NOT NULL, - updated_at timestamp with time zone NOT NULL, - owner_id uuid NOT NULL, - organization_id uuid NOT NULL, - template_id uuid NOT NULL, - deleted boolean DEFAULT false NOT NULL, - name character varying(64) NOT NULL, - autostart_schedule text, - ttl bigint, - last_used_at timestamp with time zone DEFAULT '0001-01-01 00:00:00+00'::timestamp with time zone NOT NULL, - dormant_at timestamp with time zone, - deleting_at timestamp with time zone, - automatic_updates automatic_updates DEFAULT 'never'::automatic_updates NOT NULL, - favorite boolean DEFAULT false NOT NULL, - next_start_at timestamp with time zone -); - -COMMENT ON COLUMN workspaces.favorite IS 'Favorite is true if the workspace owner has favorited the workspace.'; - CREATE VIEW workspace_prebuilds AS WITH all_prebuilds AS ( SELECT w.id, diff --git a/coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql b/coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql new file mode 100644 index 0000000000000..9d9ae7aff4bd9 --- /dev/null +++ b/coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql @@ -0,0 +1,58 @@ +DROP VIEW workspace_prebuilds; +DROP VIEW workspace_latest_builds; + +-- Revert to previous version from 000314_prebuilds.up.sql +CREATE VIEW workspace_latest_builds AS +SELECT DISTINCT ON (workspace_id) + wb.id, + wb.workspace_id, + wb.template_version_id, + wb.job_id, + wb.template_version_preset_id, + wb.transition, + wb.created_at, + pj.job_status +FROM workspace_builds wb + INNER JOIN provisioner_jobs pj ON wb.job_id = pj.id +ORDER BY wb.workspace_id, wb.build_number DESC; + +-- Recreate the dependent views +CREATE VIEW workspace_prebuilds AS + WITH all_prebuilds AS ( + SELECT w.id, + w.name, + w.template_id, + w.created_at + FROM workspaces w + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + ), workspaces_with_latest_presets AS ( + SELECT DISTINCT ON (workspace_builds.workspace_id) workspace_builds.workspace_id, + workspace_builds.template_version_preset_id + FROM workspace_builds + WHERE (workspace_builds.template_version_preset_id IS NOT NULL) + ORDER BY workspace_builds.workspace_id, workspace_builds.build_number DESC + ), workspaces_with_agents_status AS ( + SELECT w.id AS workspace_id, + bool_and((wa.lifecycle_state = 'ready'::workspace_agent_lifecycle_state)) AS ready + FROM (((workspaces w + JOIN workspace_latest_builds wlb ON ((wlb.workspace_id = w.id))) + JOIN workspace_resources wr ON ((wr.job_id = wlb.job_id))) + JOIN workspace_agents wa ON ((wa.resource_id = wr.id))) + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + GROUP BY w.id + ), current_presets AS ( + SELECT w.id AS prebuild_id, + wlp.template_version_preset_id + FROM (workspaces w + JOIN workspaces_with_latest_presets wlp ON ((wlp.workspace_id = w.id))) + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + ) + SELECT p.id, + p.name, + p.template_id, + p.created_at, + COALESCE(a.ready, false) AS ready, + cp.template_version_preset_id AS current_preset_id + FROM ((all_prebuilds p + LEFT JOIN workspaces_with_agents_status a ON ((a.workspace_id = p.id))) + JOIN current_presets cp ON ((cp.prebuild_id = p.id))); diff --git a/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql b/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql new file mode 100644 index 0000000000000..a22c926e07273 --- /dev/null +++ b/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql @@ -0,0 +1,85 @@ +-- Drop the dependent views +DROP VIEW workspace_prebuilds; +-- Previously created in 000314_prebuilds.up.sql +DROP VIEW workspace_latest_builds; + +-- The previous version of this view had two sequential scans on two very large +-- tables. This version optimized it by using index scans (via a lateral join) +-- AND avoiding selecting builds from deleted workspaces. +CREATE VIEW workspace_latest_builds AS +SELECT + latest_build.id, + latest_build.workspace_id, + latest_build.template_version_id, + latest_build.job_id, + latest_build.template_version_preset_id, + latest_build.transition, + latest_build.created_at, + latest_build.job_status +FROM workspaces +LEFT JOIN LATERAL ( + SELECT + workspace_builds.id AS id, + workspace_builds.workspace_id AS workspace_id, + workspace_builds.template_version_id AS template_version_id, + workspace_builds.job_id AS job_id, + workspace_builds.template_version_preset_id AS template_version_preset_id, + workspace_builds.transition AS transition, + workspace_builds.created_at AS created_at, + provisioner_jobs.job_status AS job_status + FROM + workspace_builds + JOIN + provisioner_jobs + ON + provisioner_jobs.id = workspace_builds.job_id + WHERE + workspace_builds.workspace_id = workspaces.id + ORDER BY + build_number DESC + LIMIT + 1 +) latest_build ON TRUE +WHERE workspaces.deleted = false +ORDER BY workspaces.id ASC; + +-- Recreate the dependent views +CREATE VIEW workspace_prebuilds AS + WITH all_prebuilds AS ( + SELECT w.id, + w.name, + w.template_id, + w.created_at + FROM workspaces w + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + ), workspaces_with_latest_presets AS ( + SELECT DISTINCT ON (workspace_builds.workspace_id) workspace_builds.workspace_id, + workspace_builds.template_version_preset_id + FROM workspace_builds + WHERE (workspace_builds.template_version_preset_id IS NOT NULL) + ORDER BY workspace_builds.workspace_id, workspace_builds.build_number DESC + ), workspaces_with_agents_status AS ( + SELECT w.id AS workspace_id, + bool_and((wa.lifecycle_state = 'ready'::workspace_agent_lifecycle_state)) AS ready + FROM (((workspaces w + JOIN workspace_latest_builds wlb ON ((wlb.workspace_id = w.id))) + JOIN workspace_resources wr ON ((wr.job_id = wlb.job_id))) + JOIN workspace_agents wa ON ((wa.resource_id = wr.id))) + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + GROUP BY w.id + ), current_presets AS ( + SELECT w.id AS prebuild_id, + wlp.template_version_preset_id + FROM (workspaces w + JOIN workspaces_with_latest_presets wlp ON ((wlp.workspace_id = w.id))) + WHERE (w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid) + ) + SELECT p.id, + p.name, + p.template_id, + p.created_at, + COALESCE(a.ready, false) AS ready, + cp.template_version_preset_id AS current_preset_id + FROM ((all_prebuilds p + LEFT JOIN workspaces_with_agents_status a ON ((a.workspace_id = p.id))) + JOIN current_presets cp ON ((cp.prebuild_id = p.id))); From 135a6b271320fb569b812fcbec9c4dd91871cff3 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Wed, 14 May 2025 00:20:09 +1000 Subject: [PATCH 2/3] Update coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql Co-authored-by: Mathias Fredriksson --- .../000322_workspace_latest_builds_optimization.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql b/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql index a22c926e07273..d65e09ef47339 100644 --- a/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql +++ b/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql @@ -19,7 +19,7 @@ SELECT FROM workspaces LEFT JOIN LATERAL ( SELECT - workspace_builds.id AS id, + workspace_builds.id AS id, workspace_builds.workspace_id AS workspace_id, workspace_builds.template_version_id AS template_version_id, workspace_builds.job_id AS job_id, From ed920c3c76108cdd60e176804860a0edc9b92ec7 Mon Sep 17 00:00:00 2001 From: Danny Kopping Date: Tue, 13 May 2025 16:41:39 +0200 Subject: [PATCH 3/3] chore: rename migrations Signed-off-by: Danny Kopping --- ...n.sql => 000323_workspace_latest_builds_optimization.down.sql} | 0 ....up.sql => 000323_workspace_latest_builds_optimization.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename coderd/database/migrations/{000322_workspace_latest_builds_optimization.down.sql => 000323_workspace_latest_builds_optimization.down.sql} (100%) rename coderd/database/migrations/{000322_workspace_latest_builds_optimization.up.sql => 000323_workspace_latest_builds_optimization.up.sql} (100%) diff --git a/coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql b/coderd/database/migrations/000323_workspace_latest_builds_optimization.down.sql similarity index 100% rename from coderd/database/migrations/000322_workspace_latest_builds_optimization.down.sql rename to coderd/database/migrations/000323_workspace_latest_builds_optimization.down.sql diff --git a/coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql b/coderd/database/migrations/000323_workspace_latest_builds_optimization.up.sql similarity index 100% rename from coderd/database/migrations/000322_workspace_latest_builds_optimization.up.sql rename to coderd/database/migrations/000323_workspace_latest_builds_optimization.up.sql