Sto esaminando il processo di riempimento dei badge in corso qui:
In particolare, la seguente query sembra presentare alcuni problemi (vedi Long-Running Sidekiq Jobs)
sql = <<~SQL
DELETE FROM user_badges
WHERE id IN (
SELECT ub.id
FROM user_badges ub
LEFT JOIN (
#{badge.query}
) q ON q.user_id = ub.user_id
#{post_clause}
WHERE ub.badge_id = :id AND q.user_id IS NULL
)
SQL
Questa query esegue un LEFT JOIN, quindi tutti i risultati da user_badges verranno restituiti indipendentemente dalla presenza di una corrispondenza, ma questa parte sembra molto confusa:
ON q.user_id = ub.user_id
...
AND q.user_id IS NULL
La query unisce le righe in cui l’user_id corrisponde, ma poi le scarta tramite la clausola WHERE, rendendo di fatto inutile quel join. Quindi mi chiedo:
-
Qual è lo scopo della funzione di riempimento? Sembra che cancelli completamente il badge in elaborazione e lo ricostruisca tutto in una volta sola. È necessario?
-
Qual è la differenza tra un badge che ha come target i post e uno che non lo è, per quanto riguarda questa funzione? Con un LEFT JOIN, ha davvero importanza quando si cerca l’identificativo badge_id corretto da cancellare per la ricostruzione?