ҎԼͷϞσϧ͕͋ͬͨ߹
app/models/user.rb
class User < ApplicationRecord
has_many :memos
end
app/models/memo.rb
class Memo < ApplicationRecord
belongs_to :user
end
Slide 10
Slide 10 text
͜ΕΛ࣮ߦ͢Δͱ…
@memos = Memo.all
@memos.each do |memo|
memo.id
memo.user.name
end
Slide 11
Slide 11 text
N + 1͕ൃੜ͢Δ
N(memo.userͷ) +
1(Memo.allͷΞΫηε)
SELECT 'memos'.* FROM 'memos' # Memo.allͷΞΫηε
# memo.user.nameͷΞΫηε
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 1 LIMIT 1
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 2 LIMIT 1
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 3 LIMIT 1
Slide 12
Slide 12 text
RailsͬͯΔͱɺ
N + 1Λ؆୯ʹղফͰ͖·͢ΑͶ
Slide 13
Slide 13 text
includes, preload, eager_load
Λ͑ྑ͍
@memos = Memo.all.includes(:user)
@memos.each do |memo|
memo.id
memo.user.name
end
SELECT 'memo'.* FROM 'memos'
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' IN (1, 2, 3)
N + 1→1 + 1ʹͳΔ
Slide 14
Slide 14 text
includesͱ͔eager_loadͱ͔
৭ʑ͋Γ·͢ΑͶ
Slide 15
Slide 15 text
N + 1ΛղܾͰ͖Δ͔൱͔
• N + 1ΛղܾͰ͖ͳ͍
• joins
• N + 1ΛղܾͰ͖Δʢؔ࿈ςʔϒϧใΛؚΊͯΩϟογϡ͢Δʣ
• eager_load
• LEFT OUTER JOINΛར༻͢Δʢt0_r0Έ͍ͨͳͭʣ
• preload
• IN۟Λར༻ͯ͠ɺෳΫΤϦͰऔͬͯ͘Δ
• whereͰؔ࿈ςʔϒϧͷใΛߜΕͳ͍
• includes
• eager_load, preloadΛঢ়گʹԠͯ͡ɺ͍͚͢Δ