Ruby Active Record加入并包括为count生成不同的sql

问题描述 投票:1回答:1

这是我的表格:

User
id:          primary key
user_name:
role_id:     foreign key     **NOT NULL**

--

Role
id:          primary key
name:

我正在使用Active Record执行以下语句:

声明1:

User.includes(:role).size
   (1.1ms)  SELECT COUNT(*) FROM "users"

声明2:

User.joins(:role).size
   (1.8ms)  SELECT COUNT(*) FROM "users" INNER JOIN "roles" ON "roles"."id" = "user"."role_id"

基于以下事实:

  1. 外键role_id不为null
  2. 在没有连接的情况下计数(*)具有更好的性能和资源使用

我很困惑为什么这两个查询生成不同的SQL。更准确的说,为什么连接会生成性能较差的SQL?

ruby-on-rails ruby activerecord rails-activerecord
1个回答
4
投票

ActiveRecord根本就不那么聪明。通过电话

User.joins(:role).size

你告诉它INNER JOIN roles表,然后检查计数。

它使用INNER JOIN甚至计数,因为它不够聪明,因为你有一个外键并且该列不可为空并且roles表上没有条件,所以实际上并不需要连接。

调用

User.includes(:role).size

不会生成连接,因为您没有告诉ActiveRecord加载所有已定义角色的用户,并且它使用左连接或单独的查询来加载角色。

© www.soinside.com 2019 - 2024. All rights reserved.