Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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
子句中查询的属性)

ActiveRecord
distinct
方法用于指定唯一性约束,但只使用
arel
执行相同的
SQL distinct
查询,因此性能应该没有差异

注意:作为旁注,您不需要在
select
查询中枚举
users
的所有所需字段。以下内容应为您选择
users
表的所有字段:

@users = @users.select('DISTINCT(users.id), users.*')