From c82fd09e0d98e3b13bee6c9598017947a4d9b5f8 Mon Sep 17 00:00:00 2001 From: Las Zenow Date: Wed, 18 Nov 2020 11:52:26 +0000 Subject: [PATCH] Optimize submission deletion The nested select was producing a sequential lookup into the books table, that took hours to resolv. --- lib/database/database.go | 1 + lib/database/submissions.go | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/database/database.go b/lib/database/database.go index 1df67bd..1f0c25f 100644 --- a/lib/database/database.go +++ b/lib/database/database.go @@ -246,6 +246,7 @@ CREATE INDEX IF NOT EXISTS visits_book_id_idx on visits(book_id); CREATE INDEX IF NOT EXISTS submissions_id_idx on submissions(submission_id); CREATE INDEX IF NOT EXISTS submissions_book_idx on submissions(book_id); CREATE INDEX IF NOT EXISTS submissions_user_idx on submissions(user_id); +CREATE INDEX IF NOT EXISTS submissions_last_modified_idx on submissions(last_modified); -- Submissions constraint ALTER TABLE ONLY submissions diff --git a/lib/database/submissions.go b/lib/database/submissions.go index aad7d31..c9b165b 100644 --- a/lib/database/submissions.go +++ b/lib/database/submissions.go @@ -100,11 +100,21 @@ func (db *pgDB) submissionsCleaner() { for true { time.Sleep(periodicity) _, err := db.sql.Model(&Submission{}). - Where("book_id is null OR book_id in (SELECT id FROM books WHERE active is true)"). + Where("book_id is null"). Where("last_modified < CURRENT_TIMESTAMP - interval ?", fmt.Sprintf("%d days", daysExpireSubmission)). Delete() if err != nil { - log.Error("Error deleting submissions: ", err) + log.Error("Error deleting null submissions: ", err) + } + + _, err = db.sql.Model(&Submission{}). + TableExpr(`books`). + Where("book_id = books.id"). + Where("books.active is true"). + Where("last_modified < CURRENT_TIMESTAMP - interval ?", fmt.Sprintf("%d days", daysExpireSubmission)). + Delete() + if err != nil { + log.Error("Error deleting approved submissions: ", err) } } }