3883bc05d2
This improves performance of the duplicate notification settings migration by removing duplicates in batches instead of using one big "DELETE FROM" query. The previous query would locally run over 45 minutes without even finishing. This new setup finished in a matter of seconds. Fixes #18289
32 lines
848 B
Ruby
32 lines
848 B
Ruby
class RemoveDuplicatedNotificationSettings < ActiveRecord::Migration
|
|
def up
|
|
duplicates = exec_query(%Q{
|
|
SELECT user_id, source_type, source_id
|
|
FROM notification_settings
|
|
GROUP BY user_id, source_type, source_id
|
|
HAVING COUNT(*) > 1
|
|
})
|
|
|
|
duplicates.each do |row|
|
|
uid = row['user_id']
|
|
stype = connection.quote(row['source_type'])
|
|
sid = row['source_id']
|
|
|
|
execute(%Q{
|
|
DELETE FROM notification_settings
|
|
WHERE user_id = #{uid}
|
|
AND source_type = #{stype}
|
|
AND source_id = #{sid}
|
|
AND id != (
|
|
SELECT id FROM (
|
|
SELECT min(id) AS id
|
|
FROM notification_settings
|
|
WHERE user_id = #{uid}
|
|
AND source_type = #{stype}
|
|
AND source_id = #{sid}
|
|
) min_ids
|
|
)
|
|
})
|
|
end
|
|
end
|
|
end
|