Skip to content

Commit eb114e3

Browse files
committed
added remove indexes before bulk insert and add indexes after
1 parent c1b8b00 commit eb114e3

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
@@ -184,20 +184,22 @@ def read_table(table, rows_count)
184184

185185
columns = Marshal.load(entry)
186186
columns_sql = columns_insert_sql(columns)
187-
Progress.start(table, rows_count) do
188-
until entry.eof?
189-
rows_sql = []
190-
1000.times do
191-
rows_sql << values_insert_sql(Marshal.load(entry)) unless entry.eof?
192-
end
187+
with_disabled_indexes table do
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
193194

194-
begin
195-
insert_into_table(table_sql, columns_sql, rows_sql)
196-
Progress.step(rows_sql.length)
197-
rescue
198-
rows_sql.each do |row_sql|
199-
insert_into_table(table_sql, columns_sql, row_sql)
200-
Progress.step
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
202+
end
201203
end
202204
end
203205
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)