gitlab-org--gitlab-foss/db/migrate/20160603180330_remove_duplicated_notification_settings.rb
Yorick Peterse 3883bc05d2
Remove notification settings in batches
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
2016-06-08 16:20:42 +02:00

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