在什么时候对大型项目进行所有查询以预先加载所有对象关联比较好?
让我解释一下这个问题的背景。
目前我正在研究一个在模型和关联方面变得相当复杂的项目。我开始检查服务器日志,发现由于查询中包含嵌套对象,一些视图需要一些时间才能加载。
所以我开始将其中一些查询重构为如下所示:
@process = current_account.processes.query(params)
对此:
@process = current_account.processes.includes(:messages, :parts, :people).query(params)
结果还不错。在某些视图中,我能够将视图渲染时间和 activerecord 查询时间减少 70%。
伙计,我很高兴,所以我决定做更多。但是在做出这个决定之后,我开始注意到并非所有我都重构了代码的地方,变化都很好。事实上,有些查询变得更慢了。
为了更多地解释这个问题,我有一个这样的模型:
class Process
has_many :anotations
has_many :publications
has_many :movimentations
has_many :reunions
has_many :profiles
...
里面的每一个嵌套模型process
belongs_to :user
都是这样创建的:
class Anotation
belongs_to :user
class Reunion
belongs_to :user
class Profile
belongs_to :user
它继续。
在 my show view
of 中process
,有几个选项卡显示所有这些嵌套对象以及将其添加到当前进程的用户的名称。
使用这样的查询:
@process = current_account.processes.query(params)
它的表现有点慢。所以我尝试了这样的事情:
@process = current_account.process.includes(:anotations, :publications, :movimentations,
:reunions, :profiles, :messages).query(params)
这使我加快了视图渲染的速度,但在 activerecord 中,检索这些对象的时间显着增加。user
当我急切地将对象加载到所有嵌套模型中时,它升到了天空process
:
@process = current_account.process.includes({:anotations => [:user]},
{:publications => [:user], etc...).query(params)
好吧,重构应用程序的设计以使这些关联表现出不同的行为是不会发生的,所以我再次问这个问题。
在什么时候对大型项目进行所有查询以预先加载所有对象关联比较好?
任何有关该主题的提示/最佳实践/经验将不胜感激。