Solved
PostgreSQLでN+1クエリが発生していないか調べる方法
Taro · 6/5/2026 · 21 views
ORMを使わず生のSQLでAPIを書いているのですが、一覧取得のたびにループの中で個別クエリを投げてしまっている気がします。N+1になっているかどうかの確認方法と対処法を教えてください。
Taro · 6/5/2026 · 21 views
ORMを使わず生のSQLでAPIを書いているのですが、一覧取得のたびにループの中で個別クエリを投げてしまっている気がします。N+1になっているかどうかの確認方法と対処法を教えてください。
確認方法としては、まずEXPLAIN ANALYZEでクエリの実行回数を見るより先に、アプリ側のログ(またはpg_stat_statementsのcalls列)を見るのが手っ取り早いです。1回のリクエストで同じパターンのSQLが件数分だけ発行されていたら、それがN+1です。
対処法の基本は「ループの中でクエリを投げるのをやめて、1回のJOINまたはIN句にまとめる」ことです。
例えば投稿一覧+各投稿の著者名を取りたい場合、
SELECT p.*, u.name FROM posts p JOIN users u ON u.id = p.user_id
のように1本のJOINクエリにまとめれば、投稿件数が増えてもクエリ回数は常に1回で済みます。どうしてもJOINが複雑になりすぎる場合は、関連するIDを先にまとめて集めておき、WHERE id = ANY(array)で1回だけ取得してからアプリ側でマッピングする方法も有効です。
✓ This question has been solved