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内置了