Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Ruby on rails RubyonRails Postgres/Active Record搜索优化_Ruby On Rails_Json_Ruby_Postgresql - Fatal编程技术网

Ruby on rails RubyonRails Postgres/Active Record搜索优化

Ruby on rails RubyonRails Postgres/Active Record搜索优化,ruby-on-rails,json,ruby,postgresql,Ruby On Rails,Json,Ruby,Postgresql,所以可能没有办法解决这个问题,但我想我会问: 我已经设置了Postgresql数据库。第一个表包含重播,每个重播有10个不同的玩家,并且有很多关系。我想根据我的搜索结果呈现一个JSON,其中包含与玩家的回放。然而,我正在播放大量的2000年重播,它们都有10名玩家,这意味着要搜索20000名玩家 这是索引搜索当前的外观: def index @replays = Replay.where(map_id: params['map_id'].to_i) @replays = @replays

所以可能没有办法解决这个问题,但我想我会问:

我已经设置了Postgresql数据库。第一个表包含重播,每个重播有10个不同的玩家,并且有很多关系。我想根据我的搜索结果呈现一个JSON,其中包含与玩家的回放。然而,我正在播放大量的2000年重播,它们都有10名玩家,这意味着要搜索20000名玩家

这是索引搜索当前的外观:

def index
  @replays = Replay.where(map_id: params['map_id'].to_i)
  @replays = @replays.reverse
  render json: @replays[0..2000].to_json(include: [:players])
end
搜索需要这么长时间:

Completed 200 OK in 639596ms (Views: 42.1ms | ActiveRecord: 329252.3ms)

有没有更好的方法可以搜索和呈现JSON,而且不会花这么长时间?值得注意的是,只需搜索2k个重播、20k个玩家,甚至一个特定的玩家重播只需几秒钟。第一次搜索本身也只需几秒钟,所以我认为这是一个容量问题

尝试加载重播

replays = Replay.last_two_thousands_by_map_id(params[:map_id])

render json: replays.to_json(include: [:players])

# replay.rb model
def self.last_two_thousands_by_map_id(map_id)
  includes(:players).where(map_id: map_id).order(id: :desc).limit(2000)
end

试着加载你的重播

replays = Replay.last_two_thousands_by_map_id(params[:map_id])

render json: replays.to_json(include: [:players])

# replay.rb model
def self.last_two_thousands_by_map_id(map_id)
  includes(:players).where(map_id: map_id).order(id: :desc).limit(2000)
end

您可以发布生成的实际sql查询吗?第一次搜索:选择玩家。*从玩家所在的位置。replay\u id=$1,然后在搜索玩家时:选择玩家。*从玩家所在的位置。replay\u id=$1[[replay\u id,117217]]每次重播可以发布生成的实际sql查询吗?第一次搜索:选择玩家。*从玩家所在的位置。重播id=$1,然后在搜索玩家时:选择玩家。*从玩家所在的位置。重播id=$1[[replay\u id,117217]]每次重播有效,时间大幅缩短。在254032ms的视图中完成了200次OK:34.1ms |活动记录:20682.4ms完成了提示-回答不错。我要补充的是,至少应该将该请求的一些元素放到模型范围中,以便稍微清理一下控制器@GustavMauler-供将来参考,这是一个N+1问题,会让你慢下来。这个查询看起来还是相当大的。如果您愿意,请用新的瓶颈打开另一个问题。谢谢@srack是的,我现在明白了。也许这很贪婪,但有可能获得更好的性能吗?是的,我很确定。但是,我们需要更多的信息,正如在这个问题上。打开另一张他的作品,时间大大缩短了。在254032ms的视图中完成了200次OK:34.1ms |活动记录:20682.4ms完成了提示-回答不错。我要补充的是,至少应该将该请求的一些元素放到模型范围中,以便稍微清理一下控制器@GustavMauler-供将来参考,这是一个N+1问题,会让你慢下来。这个查询看起来还是相当大的。如果您愿意,请用新的瓶颈打开另一个问题。谢谢@srack是的,我现在明白了。也许这很贪婪,但有可能获得更好的性能吗?是的,我很确定。但是,我们需要更多的信息,正如在这个问题上。打开另一个