Rails アプリの 5,000 件の N+1 問題と戦っている話

Rails アプリの 5,000 件の N+1 問題と戦っている話
makicamel • Tokyo, Japan & online • Japanese • Talk

Date: October 27, 2023
Published: November 02, 2023
Announced: unknown

https://kaigionrails.org/2023/talks/makicamel/

【発表概要】
話者の勤める会社のとある歴史あるリポジトリでは CI で約 5,000 件の N+1 問題が検知されていました。 N+1 問題はパフォーマンス劣化の代表的な要因のひとつです。 Rails にはこれを解決する includes というメソッドがあり、これを警告する Bullet という gem があります。 Bullet の警告箇所に includes を差し込めばよさそうですが、5,000 件の手修正は億劫なので実行時に N+1 クエリ発行箇所に includes を差し込む gem を作りました。

しかし現実のアプリケーションは複雑で、単純に includes すればよいというものではありません。 例えば以下のコードは alias が重複しエラーになります。

Play.joins(:actors).includes(actors: :company).joins('INNER JOIN companies force index(primary) ON companies.id = actors.company_id').load

エラーにならなくとも不要な includes はパフォーマンス劣化を招きます。 こうした意図しない変更を避けて includes を差し込む必要があります。

本セッションでは作った gem の解説と、この gem による修正をリリースする話をします。

【発表者】
makicamel
GitHub https://github.com/makicamel

Kaigi on Railsは、初学者から上級者までが楽しめるWeb系の技術カンファレンスです。
https://kaigionrails.org/

Kaigi on Rails 2023

Explore all talks recorded at Kaigi on Rails 2023
+30