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回调。