mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 11:37:58 +00:00
Co-authored-by: Vishnu Narayanan <vishnu@chatwoot.com> Co-authored-by: Sojan <sojan@pepalo.com> Co-authored-by: tds-1 <tanmay@qoala.id> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
81 lines
2.8 KiB
Ruby
81 lines
2.8 KiB
Ruby
class TestData::DatabaseOptimizer
|
|
class << self
|
|
# Tables that need trigger management
|
|
TABLES_WITH_TRIGGERS = %w[conversations messages].freeze
|
|
|
|
# Memory settings in MB
|
|
# Increased work_mem for better query performance with complex operations
|
|
WORK_MEM = 256
|
|
|
|
def setup
|
|
Rails.logger.info '==> Setting up database optimizations for improved performance'
|
|
|
|
# Remove statement timeout to allow long-running operations to complete
|
|
Rails.logger.info ' Removing statement timeout'
|
|
ActiveRecord::Base.connection.execute('SET statement_timeout = 0')
|
|
|
|
# Increase working memory for better query performance
|
|
Rails.logger.info " Increasing work_mem to #{WORK_MEM}MB"
|
|
ActiveRecord::Base.connection.execute("SET work_mem = '#{WORK_MEM}MB'")
|
|
|
|
# Set tables to UNLOGGED mode for better write performance
|
|
# This disables WAL completely for these tables
|
|
Rails.logger.info ' Setting tables to UNLOGGED mode'
|
|
set_tables_unlogged
|
|
|
|
# Disable triggers on specified tables to avoid overhead
|
|
Rails.logger.info ' Disabling triggers on specified tables'
|
|
disable_triggers
|
|
|
|
Rails.logger.info '==> Database optimizations complete, data generation will run faster'
|
|
end
|
|
|
|
def restore
|
|
Rails.logger.info '==> Restoring database settings to normal'
|
|
|
|
Rails.logger.info ' Re-enabling triggers on specified tables'
|
|
enable_triggers
|
|
|
|
Rails.logger.info ' Setting tables back to LOGGED mode'
|
|
set_tables_logged
|
|
|
|
# Reset memory settings to defaults
|
|
Rails.logger.info ' Resetting memory settings to defaults'
|
|
ActiveRecord::Base.connection.execute('RESET work_mem')
|
|
ActiveRecord::Base.connection.execute('RESET maintenance_work_mem')
|
|
|
|
Rails.logger.info '==> Database settings restored to normal operation'
|
|
end
|
|
|
|
private
|
|
|
|
def disable_triggers
|
|
TABLES_WITH_TRIGGERS.each do |table|
|
|
Rails.logger.info " Disabling triggers on #{table} table"
|
|
ActiveRecord::Base.connection.execute("ALTER TABLE #{table} DISABLE TRIGGER ALL")
|
|
end
|
|
end
|
|
|
|
def enable_triggers
|
|
TABLES_WITH_TRIGGERS.each do |table|
|
|
Rails.logger.info " Enabling triggers on #{table} table"
|
|
ActiveRecord::Base.connection.execute("ALTER TABLE #{table} ENABLE TRIGGER ALL")
|
|
end
|
|
end
|
|
|
|
def set_tables_unlogged
|
|
TABLES_WITH_TRIGGERS.each do |table|
|
|
Rails.logger.info " Setting #{table} table as UNLOGGED"
|
|
ActiveRecord::Base.connection.execute("ALTER TABLE #{table} SET UNLOGGED")
|
|
end
|
|
end
|
|
|
|
def set_tables_logged
|
|
TABLES_WITH_TRIGGERS.each do |table|
|
|
Rails.logger.info " Setting #{table} table as LOGGED"
|
|
ActiveRecord::Base.connection.execute("ALTER TABLE #{table} SET LOGGED")
|
|
end
|
|
end
|
|
end
|
|
end
|