これは何?
コードのリファクタリングの際に、パフォーマンスの計測まで行ってみたら結構な差が出てきたので、メモ。
前提
Tips
- mapを使っていた箇所をpluckを使ってリファクタリングしてみた
before
user_ids =Pls.where(pl_id: pl.id).map { |record| record['user_id'] }
after
user_ids =Pls.where(pl_id: pl.id).pluck(:user_id)
結果
- 出力されるSQLはSELECT句で全レコードを取得するか、特定のレコードを取得するかの差がある。
この差 + map処理が省略される差で処理速度がpluckの方が向上する場合が多い。
pluckを使った場合
SELECT `pl`.`user_id` FROM `pls` WHERE `pls`.`pl_id` = 3
- mapを使った場合
SELECT `pl`.* FROM `pls` WHERE `pls`.`pl_id` = 3
- パフォーマンスの比較をすると、 78倍 もの差があった。
- もともと処理の時間が短いものの、こういうのがちりつもになって、パフォーマンスの劣化を招いていくのだろう。。。
- 対象のテーブルのカラム数は10程度なので、これが増えていくとさらに差が出てくると思われる。
Before Refactoring: 0.93471800000043 seconds After Refactoring: 0.01190639999913401 seconds