- charkost/prosopite: Rails N+1 queries auto-detection with zero false positives / false negatives
- プロソパイトと読むらしい?
Prosopite is able to auto-detect Rails N+1 queries with zero false positives / false negatives.
- とのこと
- 実装は簡潔で250行ほどしかない
- https://github.com/charkost/prosopite/blob/18aa2b25fb0f4925f3fa3f37cc8ed3e3266bcb84/lib/prosopite.rb
- ActiveSupport::Notificationでsql発行をsubscribeして、同じクエリが複数回実行されたらN+1と判別する、という単純なもの
- 実際は運用してみないとわからんけどぱっと見いいんじゃん、という気がする
- flyerhzm/bullet: help to kill N+1 queries and unused eager loadingはざっとみた感じARの各メソッドをフックして「AオブジェクトがBという関連を呼んでる」みたいな情報をストックしていくことで実現している
- ので、以下のようなクエリ発行はN+1と判定しない
user = User.first token1 = user.user_token token2 = UserToken.find_by(user: user)
- たぶんprosopiteはN+1と判定する
- のでzero false positives / false negatives
- 本当に?
- 手元でRailsアプリケーション作って試してみよう、と思ったのだけどsqlite3は対応してなさそうなのでまた今度試してみます…