破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

pluckがmapより速いからと言って、いつでも使って良いわけではないそうです

Rails3.2から導入されたpluckメソッドのパフォーマンスが素晴らしい件

こちらの記事にも代表されるように、 User.map(&:id)と書くよりUser.pluck(:id)と書いたほうが方がパフォーマンスは速いと言われている。(実際速い

ただ、APIをみるとpluckはArrayを返すと書いてあり、要は、pluckを使うと、それが読まれたときにSQLが発生するのだ。 したがって、このように書くと、

User.where(id: Comment.where(...).pluck(:user_id))

この一行の中でSQLが2回走ってしまうのだ。

なので、こんな時はJOINするなりmergeを使うなりして、

User.joins(:comments).merge(Comment.where(...))

と書いたほうが、SQLの発行回数を抑えられて、パフォーマンスコストを抑えられる。

時間に追われていたためベンチマークをとっていないが、 SQLの発行というのはコストがかなり高いので、おそらく後者の方が速いはずだ。
pluckは単体で使用する際は便利だが、where文の中などで使用する際は注意が必要です。

Rails3レシピブック 190の技

Rails3レシピブック 190の技