2009-03-03
eager loadingって何?
上記の記事で、こんなことが書いてありました。
以下に、Railを使用する際に用いられる一般的なパフォーマンス向上方法を紹介しよう。
O/Rマッパーを介さずに直接SQL文を発行する
→ActiveRecord::Base::find_by_sqlメソッド
→flagment_cache
→eager loading
eager lodingというフレーズは聞いたことあるような気がしたけど、具体的に何かはよくわからなかったので調べました。
eager loadingとは
例えば下記のようなTaskモデルとProjectモデルがあったとして
class Task < ActiveRecord::Base belongs_to :project end class Project < ActiveRecord::Base has_many :tasks end
@tasks = Task.find(:all)
ビューでこんな風に書くと
<% @tasks.each do |task| -%> <%= task.project.name %> <% end -%>
tasksテーブルに入っている列の数だけクエリが生成することになり、パフォーマンス的に大変よろしくありません。先にprojectsテーブルからもデータを取得しておけば、クエリの発行回数を減らすことができます。この、「先にデータを取得しておく」ことを eager loading というらしいです。
Railsでのeager loading実装の変化
eager loadingの言葉の意味を調べる過程で、Railsのeager loadingの実装(ActiveRecord::Base.findの:includeを指定したときの挙動)が2.1を境に変更されたことがわかったのでついでにメモしておきます。*1
Rails2.1以前は、find内で:includeを指定するとLEFT OUTER JOINを使用しクエリを一回だけ実行する形式だったのが、2.1からはテーブルの数と同じ回数のクエリを発行するようになりました。
例
User.all(:include => :company)
とすると、Rails2.1以前はLEFT OUTER JOINをしています。
SELECT `users`.`id` AS t0_r0 `users`.`email AS t0_r1 . . . FROM `users` LEFT OUTER JOIN `companies` ON `companies`.id = `users`.company_id
Rails2.1以降は関連するテーブルごとにクエリを発行しています。
SELECT * FROM `users`; SELECT * FROM `companies` WHERE `companies`.id IN ('1','2', . . . );
Rails2.1以降の:includeの例外
includeで指定した関連のテーブルを:conditions内の条件に使うと2.1以前のLEFT OUTER JOINを使うようになるようです。
例
このように、companiesテーブルを:conditions内の条件で使用すると
User.all(:include => :company, :conditions => "`companies`.`name` LIKE '%google%'")
Rails2.1以降でもLEFT OUTER JOINになってしまいます。
SELECT `users`.`id` AS t0_r0 `users`.`email AS t0_r1 . . . FROM `users` LEFT OUTER JOIN `companies` ON `companies`.id = `users`.company_id WHERE `companies`.`name` LIKE '%google%'
参考
Module: ActiveRecord::Associations::ClassMethods
*1:基本的にSimpltry » Blog Archive » Rails 2.1 Eager Loadingの内容を訳しただけです
- 10 http://reader.livedoor.com/reader/
- 5 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=rails+cookie+削除 :domain&btnG=検索&lr=lang_ja
- 4 http://www.google.co.jp/search?q=form_tag&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 4 http://www.google.co.jp/search?q=rails+session&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 4 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLG_jaJP314JP314&q=サービス開発
- 3 http://www.google.com/search?ie=UTF-8&q=itunes+重い&btnG=Google+検索
- 2 http://blog-search.yahoo.co.jp/search?fr=top_ga1_sa&ei=UTF-8&p=microsoft+office+2004+for+Mac+体験版
- 2 http://d.hatena.ne.jp/rubikitch/20080627/1214504190
- 2 http://search.yahoo.co.jp/search?p=ロッキンオンジャパンフェス+2009&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=2&oq=ろっきん?%
- 2 http://www.google.co.jp/m/search?oe=UTF-8&client=safari&q=Safari+カスタマイズ