Ruby on rails ActiveRecord在Rails 4.1.2中包含过连接表,速度非常慢

Ruby on rails ActiveRecord在Rails 4.1.2中包含过连接表,速度非常慢,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我刚刚从Rails 4.0.2更新到Rails 4.1.2,并意识到ActiveRecord includes已经变得异常缓慢。过去只需几毫秒的浏览时间,现在几乎需要5分钟 我将两个表项和关键字连接在一个连接表上,该连接表在模型中具有_和_属于_-many。我有将近3000个条目、3000个关键字和8000个联接表条目 获取所有项目并包含所有关键字过去非常快,但现在需要永远: Item.includes(:keywords) 我比较了4.0.2和4.1.2的SQL,Rails似乎不再在Rail

我刚刚从Rails 4.0.2更新到Rails 4.1.2,并意识到ActiveRecord includes已经变得异常缓慢。过去只需几毫秒的浏览时间,现在几乎需要5分钟

我将两个表项和关键字连接在一个连接表上,该连接表在模型中具有_和_属于_-many。我有将近3000个条目、3000个关键字和8000个联接表条目

获取所有项目并包含所有关键字过去非常快,但现在需要永远:

Item.includes(:keywords)
我比较了4.0.2和4.1.2的SQL,Rails似乎不再在Rails 4.1.2中使用内部连接查询。数据库响应时间非常快,因此这不是问题所在

用于Rails 4.0.2的SQL

项目加载(5.8毫秒)从
项目

SQL(4.6ms)选择
关键字
*,
t0
项目id
作为 ar\U关联\U键\U名称来自
关键字
内部连接
项目\u关键字
t0
关于
关键字
id
=
t0
关键字id
其中
t0
项目id
在 (,…)

用于Rails 4.1.2的SQL

项目加载(3.7毫秒)从
项目

HABTM_关键字加载(2.8毫秒)从
items\u关键字
其中
items\u关键字
item\u id
位于(,…)

关键词加载(0.6ms)从
关键词
中选择
关键词
* (,…)中的
关键字
id

这是一个已知的问题吗?我找不到这方面的任何信息,所以我认为在报告bug报告之前最好先询问社区

现在我把Rails版本改回了4.0.2


感谢Björn

这是4.1.2中的一个bug,在这里得到解决:


通过显式引用关联,可以避免此处的性能回归:

Item.includes(:keywords).references(:keywords)
但是问题是Rails范围内的,虽然有一个补丁,但它还没有发布,所以我现在把它放在一个初始值设定项中

对我来说,这仍然是相当缓慢,但只有约一半的速度没有修复

module ActiveRecord
  # FIXME: this is a fix pulled from https://github.com/rails/rails/pull/15675
  # for a serious performance issue, look to remove it on the next Rails upgrade
  module Associations::Builder
    class HasAndBelongsToMany
      def hash
        object_id.hash
      end

      def ==(other)
        equal?(other)
      end
      alias :eql? :==
    end
  end
  module AttributeMethods
    module PrimaryKey
      def id
        return unless self.class.primary_key
        sync_with_transaction_state
        read_attribute(self.class.primary_key)
      end
    end
  end
end

如果你能让一个简单的案例展示这种行为,那么我建议用这个例子提交一份报告?使用
Item.includes(:关键字)。来查找sql
。我编辑问题并包含生成的sql。它在4.1.2中已经改变,不再使用内部联接,现在执行三个单独的查询。