One network trip for the deletion strategy

Make the deletion strategy faster by sending all the delete commands
over the network in one go. In an application with 57 models this made
cleaning an empty database 50% faster on average with PostgreSQL 9.1.
This commit is contained in:
Petteri Räty 2012-12-06 15:06:20 +02:00
parent 8e448beba5
commit 51527a0384
1 changed files with 5 additions and 48 deletions

View File

@ -3,51 +3,6 @@ require 'active_record/connection_adapters/abstract_adapter'
require "database_cleaner/generic/truncation" require "database_cleaner/generic/truncation"
require 'database_cleaner/active_record/base' require 'database_cleaner/active_record/base'
require 'database_cleaner/active_record/truncation' require 'database_cleaner/active_record/truncation'
# This file may seem to have duplication with that of truncation, but by keeping them separate
# we avoiding loading this code when it is not being used (which is the common case).
module ActiveRecord
module ConnectionAdapters
class MysqlAdapter < MYSQL_ADAPTER_PARENT
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)};")
end
end
class Mysql2Adapter < MYSQL2_ADAPTER_PARENT
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)};")
end
end
class JdbcAdapter < AbstractAdapter
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)};")
end
end
class PostgreSQLAdapter < POSTGRE_ADAPTER_PARENT
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)};")
end
end
class SQLServerAdapter < AbstractAdapter
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)};")
end
end
class OracleEnhancedAdapter < AbstractAdapter
def delete_table(table_name)
execute("DELETE FROM #{quote_table_name(table_name)}")
end
end
end
end
module DatabaseCleaner::ActiveRecord module DatabaseCleaner::ActiveRecord
class Deletion < Truncation class Deletion < Truncation
@ -55,9 +10,11 @@ module DatabaseCleaner::ActiveRecord
def clean def clean
connection = connection_class.connection connection = connection_class.connection
connection.disable_referential_integrity do connection.disable_referential_integrity do
tables_to_truncate(connection).each do |table_name| sql = tables_to_truncate(connection).map do |table_name|
connection.delete_table table_name "DELETE FROM #{connection.quote_table_name(table_name)}"
end end.join(";")
connection.execute sql
end end
end end