Ruby on rails 我可以减少的一种方法是什么?包括关联查询?
我有一个非常慢的查询,如下所示:Ruby on rails 我可以减少的一种方法是什么?包括关联查询?,ruby-on-rails,Ruby On Rails,我有一个非常慢的查询,如下所示: people = includes({ project: [{ best_analysis: :main_language }, :logo] }, :name, name_fact: :primary_language) .where(name_id: limit(limit).unclaimed_people(opts)) 查看includes方法调用,注意正在加载大量关联。书中有以下引文: 例如,考虑这一点: Car.all
people = includes({ project: [{ best_analysis: :main_language }, :logo] }, :name, name_fact: :primary_language)
.where(name_id: limit(limit).unclaimed_people(opts))
查看includes
方法调用,注意正在加载大量关联。书中有以下引文:
例如,考虑这一点:
Car.all.includes(:drivers, { parts: :vendors }, :log_messages)
这里可以实例化多少个ActiveRecord对象
答案是:
# Cars * ( avg # drivers/car + avg log messages/car + average parts/car * ( average parts/vendor) )
每个即时加载都会增加实例化对象的数量,反过来又会减慢查询速度。如果不使用这些对象,则可能会不必要地减慢查询速度。请注意嵌套的即时加载(上例中的零件和供应商)如何真正增加实例化对象的数量
要小心嵌套在您急切的负载中,并始终使用类似于生产的数据进行测试,以查看includes是否真的提高了您的整体性能。”
然而,这本书没有提到什么可以很好地替代这一点。所以我的问题是,在我开始回答之前,我可以用什么样的技巧来代替includes
?。我没有看到您对查询使用任何分页或限制,这可能会有很大帮助
不幸的是,真的没有。如果你在一个视图中使用所有的对象,那没关系。不过,包括
,还有一种可能的替代方法。这相当复杂,但有时仍然很有用:连接所有需要的表,只从中选择要使用的字段,为它们命名,并作为平面结构访问它们
差不多
(注意:它使用arel帮助程序。在使用语法如NameFact[:id]
的模型中,需要包括ArelHelpers::ArelTable
)
我不确定这对你的案子是否有效,但我知道这是唯一的选择 在我回答之前。我没有看到您对查询使用任何分页或限制,这可能会有很大帮助
I have an extremely slow query that looks like this
不幸的是,真的没有。如果你在一个视图中使用所有的对象,那没关系。不过,包括
,还有一种可能的替代方法。这相当复杂,但有时仍然很有用:连接所有需要的表,只从中选择要使用的字段,为它们命名,并作为平面结构访问它们
差不多
(注意:它使用arel帮助程序。在使用语法如NameFact[:id]
的模型中,需要包括ArelHelpers::ArelTable
)
我不确定这对你的案子是否有效,但我知道这是唯一的选择
I have an extremely slow query that looks like this
有两个潜在原因:
解释生成的查询(检查日志以获取查询或.to_sql
),并确保它没有执行表扫描和其他代价高昂的操作
解释生成的查询(检查日志以获取查询或.to_sql
),并确保它没有执行表扫描和其他代价高昂的操作
您是否正在检索包含的所有关系?如果您的意思是,如果我是否正在使用包含的所有关系,则是。这些模型是视图所必需的。您是否正在检索所有包含的关系?如果您的意思是,如果我是否正在使用包含的所有关系,则是。视图需要这些模型。对于#2,ActiveRecord内置了#2,ActiveRecord内置了