diff --git a/packages/db/src/schema/planner.ts b/packages/db/src/schema/planner.ts index d789283..a797ef4 100644 --- a/packages/db/src/schema/planner.ts +++ b/packages/db/src/schema/planner.ts @@ -1,4 +1,4 @@ -import { pgSchema, text, timestamp, boolean, customType } from "drizzle-orm/pg-core"; +import { pgSchema, text, timestamp, boolean, customType, index } from "drizzle-orm/pg-core"; const bytea = customType<{ data: Buffer }>({ dataType() { @@ -16,4 +16,9 @@ export const sessions = plannerSchema.table("sessions", { createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), lastActivity: timestamp("last_activity", { withTimezone: true }).notNull().defaultNow(), closed: boolean("closed").notNull().default(false), -}); +}, (t) => ({ + // Hourly `expireSessions()` job runs `DELETE WHERE last_activity < cutoff`. + // Without this index it's a full table scan that grows linearly with + // total sessions ever created. + lastActivityIdx: index("sessions_last_activity_idx").on(t.lastActivity), +}));