LoginSignup
6
11

More than 5 years have passed since last update.

N + 1問題の検出とその対応(検出編)

Last updated at Posted at 2017-05-02

N+1問題

N+1 問題とは、Tree 状の情報を DB から読み出す際、全レコードの取得に一つ+各レコード分だけ SQL を発行してしまう問題のこと
余分なクエリを減らすために今回はN+1問題の検出とその対応について書いてく

N + 1問題の検出とその対応(対応編) 対応編はこちらから

bullet

まずN+1問題を検出するgemを紹介する
このbulletというgemはアクセスしたページでN+1問題が検出された時にポップアップやログを残してくれる。

Gemfile
gem 'bullet'

Gemfileに書いたらbundle installしてください

config/environments/development.rb
config.after_initialize do
    Bullet.enable = true # bullet を有効にする
    Bullet.alert         = true # ブラウザのJavaScriptアラート
    Bullet.bullet_logger = false # Rails.root/log/bullet.log
    Bullet.console       = false # ブラウザの console.log の出力先
    Bullet.rails_logger = false # Railsのログ
    Bullet.add_footer   = false # 画面の下部に表示
  end

config/environments/development.rb に上記のような設定を書きます。
今回はjavascriptのアラートだけ有効にしてみました。

次にN+1問題が発生するように簡単なものを記述します。

articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end
end
index.html.haml
.row
  .span16
    %table.bordered-table.zebra-striped
      %thead
        %tr
          %th id
          %th userのメールアドレス
          %th title
      %tbody
        - @articles.each do |ar|
          %tr
            %td= ar.id
            %td= ar.user.email
            %td= ar.title

この場合Viewでarticleからuserを呼び出すときに発生します。
実際にこのページにアクセスしてみると、、、

スクリーンショット 2017-05-02 13.56.24.png

無事に検出されました。

感想

bulletを使ってみると意外にN+1問題が発生してるところがあったりした

次回はN+1問題の対応編を書いていきたいと思う。

6
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
11