Sql 低内存销毁操作
我有以下关系数据库:Sql 低内存销毁操作,sql,ruby-on-rails,ruby,postgresql,memory,Sql,Ruby On Rails,Ruby,Postgresql,Memory,我有以下关系数据库: class Search has_many :items , dependent: :destroy end class Item has_many :sub_items , dependent: :destroy end class SubItem end 项目范围从100到10000。 SumItems平均约为100个 为了保持低记忆,我使用了以下方法: 类搜索 before_destroy :destroy_items_in_batches d
class Search
has_many :items , dependent: :destroy
end
class Item
has_many :sub_items , dependent: :destroy
end
class SubItem
end
项目范围从100到10000。
SumItems平均约为100个
为了保持低记忆,我使用了以下方法:
类搜索
before_destroy :destroy_items_in_batches
def destroy_items_in_batches
self.try(:items).try(:in_batches, { of: 300 } ).try(:destroy_all)
end
类项目
before_destroy :destroy_transactions_in_batches
def destroy_transactions_in_batches
self.try(:sub_items).try(:in_batches, { of: 100 } ).try(:destroy_all)
end
这仍然不够,所以我在查询中添加了一个select
,以减少加载的内存,因为我正在销毁它,所以我只关心需要从数据库中删除的ID
self.try(:items).try(:select,:id).try(:in_batches, { of: 300 } ).try(:destroy_all)
self.try(:sub_items).try(:select,:id).try(:in_batches, { of: 100 } ).try(:destroy_all)
我还能做些什么来消除内存使用?
(除了减少批量的明显解决方案之外)我建议您将
销毁所有替换为删除所有delete_all
将直接从数据库中删除对象(记录),而无需将它们加载到内存或读取它们
需要注意的是,不会运行ActiveRecord回调,因此您需要在必要时自行处理。我建议您将destroy\u all
替换为delete\u all
delete_all
将直接从数据库中删除对象(记录),而无需将它们加载到内存或读取它们
需要注意的是,不会运行ActiveRecord回调,因此您需要在必要时自行处理。使用destroy\u all
将每个对象实例化到内存中,然后在仅销毁数据库中的那一行之前运行每个项的回调。效率很低
相反,正如Marc所建议的,您应该按以下顺序使用delete\u all
:
SubItem.where(conditions).delete_all
Item.where(conditions).delete_all
Search.where(conditions).delete_all
这将运行一条SQL语句,如DELETE FROM sub_items WHERE conditions…
。三条SQL语句,而不是(可能)数百条或数千条。应该快很多 使用destroy\u all
实际上将每个对象实例化到内存中,然后在仅销毁数据库中的那一行之前运行每个项的回调。效率很低
相反,正如Marc所建议的,您应该按以下顺序使用delete\u all
:
SubItem.where(conditions).delete_all
Item.where(conditions).delete_all
Search.where(conditions).delete_all
这将运行一条SQL语句,如DELETE FROM sub_items WHERE conditions…
。三条SQL语句,而不是(可能)数百条或数千条。应该快很多 是的,我想我会的。删除所有与相关外键输入相关的内容,就是这样:我最近开始认识到,过于执着于Rails是不好的,我应该实现更多本机/半本机SQL/HTML/JS,而不是像“Rails方式”那样进行翻转。是的,我想我会的。删除所有带有相关外键输入的内容,就是这样:我最近开始认识到,过于执着于Rails是不好的,我应该实现更多本机/半本机SQL/HTML/JS,而不是像“Rails方式”那样进行翻转。谢谢,行了。我将按照这里的建议实现我自己的dependent-on-destroy回调。谢谢,可以。我将按照这里的建议实现自己的依赖于destroy回调。