From f7ac0f440af825b099d58faf659db6b02dd76273 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 6 Aug 2026 11:11:42 +0100 Subject: [PATCH] perf(webapp,database): index the newest-task-version lookup Schedule validation seeks (projectId, slug) and then sorts every matching row by createdAt to return one. A project gains a row per task per deploy, so the sort grows with project age. Index the sort key so Postgres scans backward and stops at the first row, and select only the field the check reads. --- .server-changes/faster-schedule-validation-lookup.md | 6 ++++++ apps/webapp/app/v3/services/checkSchedule.server.ts | 3 +++ .../migration.sql | 1 + internal-packages/database/prisma/schema.prisma | 1 + 4 files changed, 11 insertions(+) create mode 100644 .server-changes/faster-schedule-validation-lookup.md create mode 100644 internal-packages/database/prisma/migrations/20260806100000_add_background_worker_task_project_id_slug_created_at_index/migration.sql diff --git a/.server-changes/faster-schedule-validation-lookup.md b/.server-changes/faster-schedule-validation-lookup.md new file mode 100644 index 00000000000..db83ef6b009 --- /dev/null +++ b/.server-changes/faster-schedule-validation-lookup.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: improvement +--- + +Creating or updating a schedule, and deploying a project with declarative schedules, is faster in long-lived projects with many deploys. diff --git a/apps/webapp/app/v3/services/checkSchedule.server.ts b/apps/webapp/app/v3/services/checkSchedule.server.ts index beb5de4b596..0115c742069 100644 --- a/apps/webapp/app/v3/services/checkSchedule.server.ts +++ b/apps/webapp/app/v3/services/checkSchedule.server.ts @@ -45,6 +45,9 @@ export class CheckScheduleService extends BaseService { slug: schedule.taskIdentifier, projectId: projectId, }, + select: { + triggerSource: true, + }, orderBy: { createdAt: "desc", }, diff --git a/internal-packages/database/prisma/migrations/20260806100000_add_background_worker_task_project_id_slug_created_at_index/migration.sql b/internal-packages/database/prisma/migrations/20260806100000_add_background_worker_task_project_id_slug_created_at_index/migration.sql new file mode 100644 index 00000000000..af9400ac60b --- /dev/null +++ b/internal-packages/database/prisma/migrations/20260806100000_add_background_worker_task_project_id_slug_created_at_index/migration.sql @@ -0,0 +1 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS "BackgroundWorkerTask_projectId_slug_createdAt_idx" ON "public"."BackgroundWorkerTask"("projectId", "slug", "createdAt"); diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index ca1d868ab04..8ea3ea2fc3a 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -752,6 +752,7 @@ model BackgroundWorkerTask { @@unique([workerId, slug]) // Quick lookup of task identifiers @@index([projectId, slug]) + @@index([projectId, slug, createdAt]) @@index([runtimeEnvironmentId, projectId]) @@index([runtimeEnvironmentId, slug, triggerSource]) }