積極的な読み込みと遅延読み込みについて混乱していますが、Railsクエリのパフォーマンスに違いはありますか?
両方の方法を実装する方法はありますか?
積極的な読み込みと遅延読み込みについて混乱していますが、Railsクエリのパフォーマンスに違いはありますか?
両方の方法を実装する方法はありますか?
パフォーマンスを向上させる1つの方法は、SQLクエリの数を減らすことです。これは、積極的な読み込みを通じて行うことができます。
User.find(:all, :include => :friends)
ここでは、2つのクエリのみを実行しています。
1)すべてのユーザーに1つ。
2)ユーザーのすべての友達に1つ。
ユーザーに多くの友達がいるなど、オブジェクトが多くのオブジェクトに関連付けられていて、orkutのようにリストを表示したい場合は、友達の数と同じ数のクエリに加えて、オブジェクト自体に対して1つのクエリを実行します。
users = User.find(:all)
次に、次のように、各ユーザーフレンドをクエリします。
users.each do |user|
friend = Friend.find_by_user_id(user.id)
end
ここ
1)すべてのユーザーに対して1つのクエリ。
2)N番号のNクエリ。ユーザーの友達の。
見てみましょう:Rails 3:遅延読み込みと熱心な読み込み
それがあなたがこれを理解するのを助けることを願っています。
積極的な読み込み
プロ:すべての準備が整っているということです。
短所:スペース/メモリを使い果たしています。
遅延読み込み
逸話はあなたが覚えているのを助けるかもしれません:
A young naval cadet asked Lord Nelson why he wasn't preparing his ships:
「私は早く銃を装填しません.......私はそれを発射する必要がある前にちょうど1マイクロ秒を装填します。」彼は言った。「私は怠け者です。大学の課題などと同じように、土壇場でそれをするのが好きです。」
遅延読み込みの長所:必要になるまでデータベースにアクセスしません。
短所:必要な列を正確に選択してエイリアスを作成しない限り、データベースにN+1回アクセスすることになります。例えば
@products = Product.order("categories.name").joins(:category)
遅延読み込みポリシーを使用してデータベースを1回だけヒットする:
上記のクエリは、ビューテンプレートを呼び出すときにデータベースにN + 1回ヒットします。ここで、productはリレーションproduct.category.name
内の単一のオブジェクトです。@products
ただし、エイリアスを作成すると、1つのクエリですべてを実行できます。
@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name")
そして、次のように使用します:product.category_name