【问题标题】:is there any difference between where clause and using association object for performancewhere 子句和使用关联对象来提高性能之间有什么区别吗
【发布时间】:2021-05-11 20:36:58
【问题描述】:

例如,我们在产品和订单之间建立了关联。 下面写的这两个查询之间会有什么区别吗? 你在执行时间和性能方面都一样吗

@products = @order.products
@products = Product.where(order_id: @order.id)

或者我们可以以任何方式改进上述查询吗?

【问题讨论】:

    标签: sql ruby-on-rails database postgresql query-optimization


    【解决方案1】:

    他们做同样的事情。如果您在控制台中运行查询,您将看到类似这样的内容

    Order Load (0.3ms) SELECT "orders".* from "orders" WHERE "orders"."id" = $1 LIMIT $2, [["ID", 1], "LIMIT", 1]
    Product Load (0.3ms) SELECT "products".* from "products" WHERE "products"."order_id" = $1 [["ORDER_ID", 1]]
    

    【讨论】:

    • 我知道他们都做同样的事情,但哪一个对执行时间和性能有好处?
    • 它们都是一样的。在两者中,它都需要找到订单,然后为该订单选择产品。性能调整将取决于你想用它做什么。您是否要访问每种产品的任何订单信息?如果是这样,那么您将需要立即加载订单,@order.products.include(:order) 或 Product.include(:order).where(order_id: @order.id)
    • 约定将规定第一个选项。
    • @order.products 是否在第一次执行后从缓存中获取数据,如果每次都从数据库中获取数据?
    • P几乎所有查询在第一次执行后都会使用缓存
    【解决方案2】:

    他们都做同样的事情,性能是一样的。这些查询将使用订单 ID 从产品表中获取产品。相关的sql查询会一样。

    唯一的区别是,如果您在加载订单之前使用了预加载,则此查询将在内存中运行,因为相关产品已经加载: @products = @order.products

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2015-05-24
      • 1970-01-01
      • 2010-09-09
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多