ActiveRecordでpluckとselectしてpluckに変化はあるか?

Table of Contents

ちょっとした疑問になりますが、明確な違いなどは生まれるのか気になるコードがあります。

User.select(:name).pluck(:name)

User.pluck(:name)

に速度差や消費メモリ差はあるのか?

SQLは同じ

出力されるSQLはどちらも同じでした。

SELECT `users`.`name` FROM `users`

速度は微妙な変化

90万件に対して行った結果

pluckのみ select+pluck
3228 3349
3152 2972
3126 3370
3101 3144
3271 2945
3454 3227
3120 3306
3488 3577
3046 3072
3228 3413

pluckのみ平均: 3210.0ms select+pluck平均: 3231.625ms

しかしselectは確実に処理されてる

SQLは同じ、速度差も大きな違いはないが、トレースしたところ 確実はselectメソッドは処理されてからpluckを呼び出されている。 速度で微妙にpluckのみが勝っているのもこのselectメソッド処理が呼ばれているからではないかと予想。

結論

実践に影響を及ぼす変化は起こりにくいと考えてよいが、 確実に無駄な処理は起きていることは事実であり、表面上のコード量も増えるので、 pluckを呼ぶのであれば,selectは呼ぶ必要はない。

このエントリーをはてなブックマークに追加