Ruby on rails ActiveRecord在Rails 4.1.2中包含过连接表,速度非常慢
我刚刚从Rails 4.0.2更新到Rails 4.1.2,并意识到ActiveRecord includes已经变得异常缓慢。过去只需几毫秒的浏览时间,现在几乎需要5分钟 我将两个表项和关键字连接在一个连接表上,该连接表在模型中具有_和_属于_-many。我有将近3000个条目、3000个关键字和8000个联接表条目 获取所有项目并包含所有关键字过去非常快,但现在需要永远: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
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中已经改变,不再使用内部联接,现在执行三个单独的查询。