2012-07-30 38 views
2

在哪一点上可以对大型项目进行所有查询以加载所有对象关联?
让我来解释一下这个问题的背景。
目前我正在研究一个在模型和关联方面变得相当复杂的项目。我开始检查服务器日志,发现一些视图需要一些时间来加载,因为查询中包含的嵌套对象。
所以我开始重构某些查询的到这样的事情:什么时候Rails Eager默认加载所有关联是一个好主意?

@process = current_account.processes.query(params) 

要这样:

@process = current_account.processes.includes(:messages, :parts, :people).query(params) 

结果是相当不错的。在某些视图中,我能够将视图渲染时间和主动记录查询时间缩短70%。
我很高兴的人,所以我决定做更多。但是在做出这个决定之后,我开始注意到并非所有地方都重构了代码,这些变化都很好。事实上,有些查询变得更慢。
要解释一下关于这个问题我有这样一个模型:

​​

而且里面processbelongs_to :user创建它像这样这些嵌套模式中的每一个:

class Anotation 
    belongs_to :user 

class Reunion 
    belongs_to :user 

class Profile 
    belongs_to :user 

它去上。
在我的show viewprocess中,有几个选项卡显示这些嵌套对象的全部以及将其添加到当前进程的用户的名称。
有了这样的查询:

@process = current_account.processes.query(params) 

它执行有点慢。所以,我想是这样的:

@process = current_account.process.includes(:anotations, :publications, :movimentations, 
    :reunions, :profiles, :messages).query(params) 

这使我获得的视图渲染速度,但在ActiveRecord的,在时间检索这些对象已显著上升。而且它提出的天空时,我渴望加载的process所有嵌套模型这样的内部user对象:

@process = current_account.process.includes({:anotations => [:user]}, 
    {:publications => [:user], etc...).query(params) 

好,重构应用程序的设计,这些协会不同的行为是不会发生的,所以我再问这个问题。
在哪一点很好,使大型项目上的所有查询加载所有的对象关联?
关于这个问题的任何提示/最佳实践/经验将非常感激。

+0

我建议一个标题,如“什么时候Rails加载默认情况下所有关联都是一个好主意? – lulalala 2013-03-12 08:20:12

回答

1

“大型项目上的所有查询都急切地加载所有对象关联” - 几乎从不。至少在应用程序内部没有帮助。

如果我在你的鞋子里,我会开始寻找缓存(你没有提到,所以我不知道你是否在做任何)。特别是碎片缓存,因为它看起来很适合你的标签结构。

在一个应用程序中,我使用上下文相关的侧边栏来显示项目组列表,每个组包含指向相关项目的链接(18个组中的任意组中的n个项目),每个项目显示相关项目的名称链接表单(和其他一些小数据项)。

缓存侧边栏中的每个组,同时缓存组中每个相关项目的条目。重构控制器以将相关项目累积为@relateds,并且该代码使用缓存来确定提取是否有必要(在缓存未命中时)。在智能缓存过期中有一点点工作,性能非常好。

假设Project X在12个类别(120个相关项目)中分别有10个相关项目。在第一个项目X展会上,您付出了代价。更改某个类别中1个相关项目的名称会使该项目,该项目的组以及整个侧边栏的缓存失效。在Project X的下一个展示中,重构侧边栏涉及1个项目的缓存未命中(使用一个或两个连接读取该项目的记录),以便重建项目缓存,从10个项目缓存重建一个缓存(1新的+9现有),其他11个类别的缓存命中(不读取这110个相关的项目),并在最后得到重建的侧边栏缓存。

感觉就像你可以为你的标签采用类似的策略,也许更细粒度,但这取决于你的实现。

+1

这是一个很好的观点。我从来没有考虑过缓存机制,所以我想我会检查出来。你有一些很好的缓存材料来源(教程/文档/等)? – MurifoX 2012-07-30 16:53:08

+1

我从事他的研究已经有一段时间了,但快速浏览产生了这篇文章,这似乎涵盖了相当不错的话题... http://broadcastingadam.com/2011/05/advanced_caching_in_rails/ – railsdog 2012-07-30 17:16:33

+0

Thx,我会一探究竟。 – MurifoX 2012-07-30 17:18:46

相关问题