Perf: light worker poll query + tasks(status) index
Worker polls the DB every interval (production 30s) and every poll ran SELECT * FROM tasks: full rows including result_text and error_text (up to 4000 chars each) for every task ever, growing with history. load_tasks now selects only the columns pick_next actually needs (id/project/prompt/status/depends/ priority/timestamps/executor) and only queued/completed/merged rows; running/failed rows are neither ready nor completed, so excluding them cannot change pick_next. get_task still does SELECT * for the single claimed task. Plus CREATE INDEX IF NOT EXISTS idx_tasks_status on tasks(status) in both SQLite init_db and the Postgres schema, so the poll filter stops being a full table scan on old databases too. Test: load_tasks returns only queued+completed out of queued/completed/running/failed.
This commit is contained in:
1 parent
a1e492657a
commit
26d9edac33
4 files changed
+41
-1
No files matched your search
@@ -305,6 +305,12 @@ def init_db(db_path):
|
||||
)
|
||||
migrate_tasks_table(conn)
|
||||
migrate_projects_table(conn)
|
||||
# worker 每轮 poll 都按 status 取任务(见 load_tasks 的
|
||||
# WHERE status IN (...)),无索引时是全表扫描;任务表随
|
||||
# 时间变大后索引是必须的。IF NOT EXISTS 保证老库幂等。
|
||||
conn.execute(
|
||||
"CREATE INDEX IF NOT EXISTS idx_tasks_status"
|
||||
" ON tasks(status)")
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
Reference in new issue
Block a user