From a2571ba9b982e1a02380db89bef07e274a9ad01c Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Fri, 15 Oct 2010 14:27:16 -0300 Subject: [PATCH] Fix migration to run at a reasonable time --- db/migrate/20100928000952_aggressive_indexing_strategy2.rb | 30 +++++++++++++++++++++++++++++- db/schema.rb | 6 +++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/db/migrate/20100928000952_aggressive_indexing_strategy2.rb b/db/migrate/20100928000952_aggressive_indexing_strategy2.rb index 40c8aa6..bb7adc4 100644 --- a/db/migrate/20100928000952_aggressive_indexing_strategy2.rb +++ b/db/migrate/20100928000952_aggressive_indexing_strategy2.rb @@ -1,6 +1,34 @@ class AggressiveIndexingStrategy2 < ActiveRecord::Migration def self.up - execute("delete from action_tracker_notifications where id not in (select distinct(atn.id) from action_tracker_notifications as atn JOIN action_tracker_notifications as t ON (t.profile_id = atn.profile_id and t.action_tracker_id = atn.action_tracker_id and atn.id < t.id))") + + say 'Removing duplicate notification records ...' + buffer = '' + removed = 0 + select_all( + 'select min(id) as min_id, action_tracker_id, profile_id, count(*) + from action_tracker_notifications + group by action_tracker_id, profile_id + having count(*) > 1' + ).each do |duplicate| + buffer += ('delete from action_tracker_notifications + where + profile_id = %d AND + action_tracker_id = %s AND + id > %d; + ' % [duplicate['profile_id'], duplicate['action_tracker_id'], duplicate['min_id']] + ) + if removed % 100 == 0 + execute buffer + say "Deleted " + removed.to_s + buffer = '' + end + removed += 1 + end + + if !buffer.empty? + execute buffer + end + add_index(:action_tracker_notifications, :profile_id) add_index(:action_tracker_notifications, :action_tracker_id) add_index(:action_tracker_notifications, [:profile_id, :action_tracker_id], :unique => true) diff --git a/db/schema.rb b/db/schema.rb index 39fbe4d..ee2bebd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20100923160040) do +ActiveRecord::Schema.define(:version => 20100928000952) do create_table "action_tracker", :force => true do |t| t.integer "user_id" @@ -31,6 +31,10 @@ ActiveRecord::Schema.define(:version => 20100923160040) do t.integer "profile_id" end + add_index "action_tracker_notifications", ["action_tracker_id"], :name => "index_action_tracker_notifications_on_action_tracker_id" + add_index "action_tracker_notifications", ["profile_id", "action_tracker_id"], :name => "index_action_tracker_notifications_on_profile_id_and_action_tracker_id", :unique => true + add_index "action_tracker_notifications", ["profile_id"], :name => "index_action_tracker_notifications_on_profile_id" + create_table "article_versions", :force => true do |t| t.integer "article_id" t.integer "version" -- libgit2 0.21.2