gpt4 book ai didi

ruby-on-rails - Ruby Active Record join and includes 为 count 生成不同的 sql

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:50 26 4
gpt4 key购买 nike

这是我的表格:

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不为空
  2. 在没有join的情况下使用count(*)有更好的性能和资源使用

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

最佳答案

ActiveRecord 根本就没有那么聪明。通过调用

User.joins(:role).size

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

它甚至使用 INNER JOIN 进行计数,因为它不够聪明,无法弄清楚因为您有外键 AND 该列不可为空 AND roles 表上没有条件,实际上不需要连接。

打电话

User.includes(:role).size

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

关于ruby-on-rails - Ruby Active Record join and includes 为 count 生成不同的 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52891430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com