From 6da41982cebebcc615cd0821fb1ef929d66490ba Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Tue, 3 Mar 2026 15:54:51 +0100 Subject: [PATCH] Further optimize queries for better index usage --- internal/repository/job.go | 2 +- internal/repository/jobFind.go | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/internal/repository/job.go b/internal/repository/job.go index 8055ca37..566a13b1 100644 --- a/internal/repository/job.go +++ b/internal/repository/job.go @@ -718,7 +718,7 @@ func (r *JobRepository) StopJobsExceedingWalltimeBy(seconds int) error { Set("job_state", schema.JobStateFailed). Where("job.job_state = 'running'"). Where("job.walltime > 0"). - Where("(? - job.start_time) > (job.walltime + ?)", currentTime, seconds). + Where("job.start_time < (? - job.walltime)", currentTime-int64(seconds)). RunWith(r.DB).Exec() if err != nil { cclog.Warnf("Error while stopping jobs exceeding walltime: %v", err) diff --git a/internal/repository/jobFind.go b/internal/repository/jobFind.go index d79847a0..13dd4418 100644 --- a/internal/repository/jobFind.go +++ b/internal/repository/jobFind.go @@ -270,24 +270,21 @@ func (r *JobRepository) FindConcurrentJobs( stopTime = startTime + int64(job.Duration) } - // Time buffer constants for finding overlapping jobs - // overlapBufferStart: 10s grace period at job start to catch jobs starting just after + // Time buffer constant for finding overlapping jobs // overlapBufferEnd: 200s buffer at job end to account for scheduling/cleanup overlap - const overlapBufferStart = 10 const overlapBufferEnd = 200 - startTimeTail := startTime + overlapBufferStart stopTimeTail := stopTime - overlapBufferEnd startTimeFront := startTime + overlapBufferEnd - // Reminder: BETWEEN Queries are slower and dont use indices as frequently: Can this be optimized? - queryRunning := query.Where("job.job_state = ?").Where("(job.start_time BETWEEN ? AND ? OR job.start_time < ?)", - "running", startTimeTail, stopTimeTail, startTime) + queryRunning := query.Where("job.job_state = ?", "running"). + Where("job.start_time <= ?", stopTimeTail) // Get At Least One Exact Hostname Match from JSON Resources Array in Database queryRunning = queryRunning.Where("EXISTS (SELECT 1 FROM json_each(job.resources) WHERE json_extract(value, '$.hostname') = ?)", hostname) - query = query.Where("job.job_state != ?").Where("((job.start_time BETWEEN ? AND ?) OR (job.start_time + job.duration) BETWEEN ? AND ? OR (job.start_time < ?) AND (job.start_time + job.duration) > ?)", - "running", startTimeTail, stopTimeTail, startTimeFront, stopTimeTail, startTime, stopTime) + query = query.Where("job.job_state != ?", "running"). + Where("job.start_time < ?", stopTimeTail). + Where("(job.start_time + job.duration) > ?", startTimeFront) // Get At Least One Exact Hostname Match from JSON Resources Array in Database query = query.Where("EXISTS (SELECT 1 FROM json_each(job.resources) WHERE json_extract(value, '$.hostname') = ?)", hostname)