

railsアプリケーションの開発でレコード絞り込みの際の処理について、パフォーマンス面での相談です。

レコード絞り込みを複数行う際、ActiveRecordでSQL条件を利用するのと、rubyの配列操作メソッドでフィルタするのと、どちらがレスポンス・メモリの面で良いとされるでしょうか。  
例えば以下のようにUserモデルからtypeごとに件数を取得したい場合、パフォーマンスの観点から良いとされる処理はどちらのパターンになるのでしょうか？

[code]

    # パターン1: typeごとにSQL発行して取得
    @user_type1_count = User.where(type: 1).count
    @user_type2_count = User.where(type: 2).count
    @user_type3_count = User.where(type: 3).count
    
    # パターン2: 対象の全レコード取得してからそれぞれ配列として絞り込む(SQLは1回だけ発行)
    @users = User.all
    @user_type1_count = @users.count {|user| user.type == 1 }
    @user_type2_count = @users.count {|user| user.type == 2 }
    @user_type3_count = @users.count {|user| user.type == 3 }
    
[/code]

私見ではSQL発行数の少ないパターン2がベターなのでは？と考えましたが、あくまで感覚的な予想でしかないので皆さんのアドバイスをお聞きしたいです。  
当然Userテーブル全体のレコード件数や、前後の処理内容にもよると思います。そのあたりも踏まえた回答がいただけるとなお幸いです。


CC BY-SA 4.0
2020-03-08T06:36:32.057
63658
2020-03-09T01:51:43.183
38128
question
ruby-on-rails ruby rails-activerecord
railsでレコード絞り込みを複数行う際、ActiveRecordと配列どちらがパフォーマンス的に良いのか？


件数やデータの内容にもよりますけど、ほとんどのケースでDBに任せたほうが早いです。  
あと、grouby byとdistinctを使うとSQL1つで件数とれますよ。

[code]

    User.select(:type).distinct.group(:type).count
    
[/code]


CC BY-SA 4.0
2020-03-09T01:51:43.183
63678
2020-03-09T01:51:43.183
38135
63658
answer