Sql RubyonRails独特记录 什么是从数据库返回唯一记录的最好方法,请考虑以下内容: @users = User.joins('LEFT JOIN subscriptions s ON users.id = s.user_id').includes(:profile).with_deleted.where("...", params[:conditions]).order("users.#{sort_column}" + ' ' + sort_direction).page params[:page]
它有相当数量的连接、条件和分页。因此,就目前而言,用户并不是唯一的。这是使其独特的方法之一:Sql RubyonRails独特记录 什么是从数据库返回唯一记录的最好方法,请考虑以下内容: @users = User.joins('LEFT JOIN subscriptions s ON users.id = s.user_id').includes(:profile).with_deleted.where("...", params[:conditions]).order("users.#{sort_column}" + ' ' + sort_direction).page params[:page],sql,ruby-on-rails,ruby,performance,postgresql,Sql,Ruby On Rails,Ruby,Performance,Postgresql,它有相当数量的连接、条件和分页。因此,就目前而言,用户并不是唯一的。这是使其独特的方法之一: @users = @users.select('DISTINCT(users.id), users.created_at, users.deleted_at , ...') 然而,这似乎非常缓慢,我在日志中看到了很多解释,这告诉我这不是一个好的查询 我还尝试使用uniq方法,如: @users = @users.uniq{|u| [u.email]} 这似乎比上述语句运行的时间长(web worke
@users = @users.select('DISTINCT(users.id), users.created_at, users.deleted_at , ...')
然而,这似乎非常缓慢,我在日志中看到了很多解释,这告诉我这不是一个好的查询
我还尝试使用uniq方法,如:
@users = @users.uniq{|u| [u.email]}
这似乎比上述语句运行的时间长(web worker超时)。消除重复记录的正确方法是什么?或者在这种情况下做什么才是最佳选择
大约有120k个用户,但是一次只能显示25个,因此在第一个/第二个语句中使用
.page
方法
还要注意,在第三个示例中,您正在将所有元素加载到内存中,然后进行操作,这很慢,而且内存不足
您应该选择使用distinct命令DBMS查找唯一的记录。uniq
是一个,因此它返回整个120k用户群,并使用ruby
逐个迭代以检查条件。这绝对是一种错误的过滤方式
另一方面,DISTINCT(users.id)
是由PostgreSQL
服务器处理的SQL
条件。这个应该很快执行。如果需要花费大量时间,您应该仔细检查您的索引(users.id
,subscriptions.user\u id
,profiles.user\u id
,以及基本上所有的主键和外键,以及可以在where
子句中查询的属性)
ActiveRecorddistinct
方法用于指定唯一性约束,但只使用arel
执行相同的SQL distinct
查询,因此性能应该没有差异
注意:作为旁注,您不需要在select
查询中枚举users
的所有所需字段。以下内容应为您选择users
表的所有字段:
@users = @users.select('DISTINCT(users.id), users.*')