From 6e08f8a966ec7ebb5f739037fbd06e4002a9529d Mon Sep 17 00:00:00 2001 From: Erik Kessler Date: Fri, 22 Mar 2019 13:05:51 -0400 Subject: [PATCH] Use "=" instead of IN The subquery should only return a single row so there is no need to use IN. Using "=" avoids a situation where the planner can sidestep the LIMIT in the subquery. --- lib/delayed/backend/active_record.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/delayed/backend/active_record.rb b/lib/delayed/backend/active_record.rb index bdb363c1..3f7b57f4 100644 --- a/lib/delayed/backend/active_record.rb +++ b/lib/delayed/backend/active_record.rb @@ -126,7 +126,7 @@ def self.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) # use 'FOR UPDATE' and we would have many locking conflicts quoted_name = connection.quote_table_name(table_name) subquery = ready_scope.limit(1).lock(true).select("id").to_sql - sql = "UPDATE #{quoted_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery}) RETURNING *" + sql = "UPDATE #{quoted_name} SET locked_at = ?, locked_by = ? WHERE id = (#{subquery}) RETURNING *" reserved = find_by_sql([sql, now, worker.name]) reserved[0] end