Skip to content

Commit ce0fd35

Browse files
committed
added remove indexes before bulk insert and add indexes after
1 parent 83b6420 commit ce0fd35

File tree

2 files changed

+45
-13
lines changed

2 files changed

+45
-13
lines changed

lib/dump_rake/dump_reader.rb

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,22 @@ def read_table(table, rows_count)
185185

186186
columns = Marshal.load(entry)
187187
columns_sql = columns_insert_sql(columns)
188-
Progress.start(table, rows_count) do
189-
until entry.eof?
190-
rows_sql = []
191-
1000.times do
192-
rows_sql << values_insert_sql(Marshal.load(entry)) unless entry.eof?
193-
end
188+
with_disabled_indexes table do
189+
Progress.start(table, rows_count) do
190+
until entry.eof?
191+
rows_sql = []
192+
1000.times do
193+
rows_sql << values_insert_sql(Marshal.load(entry)) unless entry.eof?
194+
end
194195

195-
begin
196-
insert_into_table(table_sql, columns_sql, rows_sql)
197-
Progress.step(rows_sql.length)
198-
rescue
199-
rows_sql.each do |row_sql|
200-
insert_into_table(table_sql, columns_sql, row_sql)
201-
Progress.step
196+
begin
197+
insert_into_table(table_sql, columns_sql, rows_sql)
198+
Progress.step(rows_sql.length)
199+
rescue
200+
rows_sql.each do |row_sql|
201+
insert_into_table(table_sql, columns_sql, row_sql)
202+
Progress.step
203+
end
202204
end
203205
end
204206
end

lib/dump_rake/table_manipulation.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,36 @@ def clear_table(table_sql)
2828
ActiveRecord::Base.connection.delete("DELETE FROM #{table_sql}", 'Clearing table')
2929
end
3030

31+
def with_disabled_indexes(table, &block)
32+
all_indexes = ActiveRecord::Base.connection.indexes(table)
33+
table_indexes = all_indexes.keep_if {|index| index.table == table}
34+
35+
remove_indexes(table_indexes)
36+
block.call
37+
add_indexes(table_indexes)
38+
end
39+
40+
def remove_indexes(indexes)
41+
indexes.each do |index|
42+
ActiveRecord::Base.connection.remove_index index.table, :name => index.name
43+
end
44+
end
45+
46+
def add_indexes(indexes)
47+
indexes.each do |index|
48+
options = {
49+
:name => index.name,
50+
:unique => index.unique,
51+
:length => index.lengths,
52+
:order => index.orders,
53+
:where => index.where,
54+
:type => index.type,
55+
:using => index.using
56+
}
57+
ActiveRecord::Base.connection.add_index index.table, index.columns, options
58+
end
59+
end
60+
3161
def insert_into_table(table_sql, columns_sql, values_sql)
3262
values_sql = values_sql.join(',') if values_sql.is_a?(Array)
3363
ActiveRecord::Base.connection.insert("INSERT INTO #{table_sql} #{columns_sql} VALUES #{values_sql}", 'Loading dump')

0 commit comments

Comments
 (0)