From 5e24480f53dd51586a7300662bb05921ee0e61dc Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 11 Jun 2025 09:09:02 +0100 Subject: [PATCH] Improved TaskRun environment indexes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### PR: Optimize **TaskRun** indexes for hot-path queries **What changed** | Object | Type | Purpose | | ------------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | | `taskrun_runtime_id_desc_idx` | **BTREE** `(runtimeEnvironmentId, id DESC) INCLUDE (createdAt)` | Eliminates explicit sort for the “latest task runs” query (`ORDER BY id DESC`) while remaining index-only. | | `taskrun_runtime_createdat_idx` | **BTREE** `(runtimeEnvironmentId, createdAt DESC) INCLUDE (id)` | Accelerates the filter-only path that scans by `createdAt >= …` without any ordering requirement. | | `taskrun_createdat_brin` | **BRIN** on `createdAt` (`pages_per_range = 128`) | Lets the planner skip whole blocks older than the time window for both queries at < 100 MB cost. | | *(cleanup)* | **DROP** `TaskRun_runtimeEnvironmentId_createdAt_id_idx` | Retires the 3-column index once the new ones are built. | **Key details** * All indexes created **CONCURRENTLY** to avoid write blocking. * `fillfactor = 90` on b-trees for balanced space vs. future growth. * Net disk usage drops **≈ 15–20 GB** while each query now gets a purpose-built access path. **Why** * Remove planner Sort nodes for the top-N “latest runs” view. * Speed up environment-filtered range scans. * Shrink index bloat and improve cache efficiency. --- .../migration.sql | 1 + .../migration.sql | 1 + .../migration.sql | 1 + .../migration.sql | 1 + internal-packages/database/prisma/schema.prisma | 7 +++++-- 5 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 internal-packages/database/prisma/migrations/20250611075637_remove_task_run_environment_created_at_id_index/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250611080026_add_task_run_environment_id_index_including_created_at/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250611080322_add_task_run_environment_created_at_index_including_id/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250611080537_add_task_run_created_at_brin_index/migration.sql diff --git a/internal-packages/database/prisma/migrations/20250611075637_remove_task_run_environment_created_at_id_index/migration.sql b/internal-packages/database/prisma/migrations/20250611075637_remove_task_run_environment_created_at_id_index/migration.sql new file mode 100644 index 0000000000..fef79ff3b8 --- /dev/null +++ b/internal-packages/database/prisma/migrations/20250611075637_remove_task_run_environment_created_at_id_index/migration.sql @@ -0,0 +1 @@ +DROP INDEX CONCURRENTLY IF EXISTS "TaskRun_runtimeEnvironmentId_createdAt_id_idx"; diff --git a/internal-packages/database/prisma/migrations/20250611080026_add_task_run_environment_id_index_including_created_at/migration.sql b/internal-packages/database/prisma/migrations/20250611080026_add_task_run_environment_id_index_including_created_at/migration.sql new file mode 100644 index 0000000000..9ca6e8c596 --- /dev/null +++ b/internal-packages/database/prisma/migrations/20250611080026_add_task_run_environment_id_index_including_created_at/migration.sql @@ -0,0 +1 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS "TaskRun_runtimeEnvironmentId_id_idx" ON "TaskRun"("runtimeEnvironmentId", "id" DESC) INCLUDE ("createdAt") WITH (fillfactor = 90); diff --git a/internal-packages/database/prisma/migrations/20250611080322_add_task_run_environment_created_at_index_including_id/migration.sql b/internal-packages/database/prisma/migrations/20250611080322_add_task_run_environment_created_at_index_including_id/migration.sql new file mode 100644 index 0000000000..dfce46195b --- /dev/null +++ b/internal-packages/database/prisma/migrations/20250611080322_add_task_run_environment_created_at_index_including_id/migration.sql @@ -0,0 +1 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS "TaskRun_runtimeEnvironmentId_createdAt_idx" ON "TaskRun"("runtimeEnvironmentId", "createdAt" DESC) INCLUDE ("id") WITH (fillfactor = 90); diff --git a/internal-packages/database/prisma/migrations/20250611080537_add_task_run_created_at_brin_index/migration.sql b/internal-packages/database/prisma/migrations/20250611080537_add_task_run_created_at_brin_index/migration.sql new file mode 100644 index 0000000000..fc74ac3fdb --- /dev/null +++ b/internal-packages/database/prisma/migrations/20250611080537_add_task_run_created_at_brin_index/migration.sql @@ -0,0 +1 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS "TaskRun_createdAt_idx" ON "TaskRun" USING BRIN ("createdAt"); diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index 9065126290..06ca39d692 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -680,9 +680,12 @@ model TaskRun { // Schedule list page @@index([scheduleId, createdAt(sort: Desc)]) // Finding runs in a batch - @@index([runtimeEnvironmentId, batchId]) - @@index([runtimeEnvironmentId, createdAt(sort: Desc), id(sort: Desc)]) @@index([runTags(ops: ArrayOps)], type: Gin) + @@index([runtimeEnvironmentId, batchId]) + // This will include the createdAt index to help speed up the run list page + @@index([runtimeEnvironmentId, id(sort: Desc)]) + @@index([runtimeEnvironmentId, createdAt(sort: Desc)]) + @@index([createdAt], type: Brin) } enum TaskRunStatus {