【发布时间】:2014-08-19 11:34:01
【问题描述】:
我刚刚从 Rails 4.0.2 更新到 Rails 4.1.2 并意识到 ActiveRecord 包含变得非常缓慢。过去只需几毫秒的查看时间现在几乎需要 5 分钟。
我通过模型中的 has_and_belongs_to_many 连接表通过连接表连接两个表 Item 和 Keyword。我有近 3000 个项目、3000 个关键字和 8000 个连接表条目。
获取所有项目并包含所有关键字过去非常快,但现在需要很长时间:
Item.includes(:keywords)
我比较了 4.0.2 和 4.1.2 的 SQL,Rails 似乎不再在 Rails 4.1.2 中使用内部连接查询。数据库响应时间非常快,所以这不是问题。
SQL for Rails 4.0.2
项目加载 (5.8ms) SELECT
items.* FROMitemsSQL (4.6ms) SELECT
keywords.*,t0.item_idAS ar_association_key_name FROMkeywordsINNER JOINitems_keywordst0开keywords.id=t0.keyword_id其中t0.item_idIN (, ...)
SQL for Rails 4.1.2
项目加载 (3.7ms) SELECT
items.* FROMitemsHABTM_Keywords 加载 (2.8ms) SELECT
items_keywords.* FROMitems_keywordsWHEREitems_keywords.item_idIN (, ...) 关键字加载 (0.6ms) SELECT
keywords.* FROMkeywordsWHEREkeywords.idIN (, ...)
这是一个已知问题吗?我在这方面找不到任何东西,所以我认为最好在报告错误报告之前先询问社区。p>
现在我将 Rails 版本改回 4.0.2。
谢谢比约恩
【问题讨论】:
-
如果你可以让一个准系统简单的案例表现出这种行为,那么我建议用这个例子提交一份报告。
-
每个版本的 Rails 生成的 SQL 是什么?使用
Item.includes(:keywords).to_sql找出答案。 -
我编辑了问题并包含了生成的 SQL。它在 4.1.2 中发生了变化,不再使用内部连接,现在执行三个单独的查询。
标签: ruby-on-rails activerecord