35

積極的な読み込みと遅延読み込みについて混乱していますが、Railsクエリのパフォーマンスに違いはありますか?

両方の方法を実装する方法はありますか?

4

2 に答える 2

53

熱心な読み込み

パフォーマンスを向上させる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:遅延読み込みと熱心な読み込み

それがあなたがこれを理解するのを助けることを願っています。

于 2012-04-10T07:34:08.590 に答える
20

積極的な読み込み

プロ:すべての準備が整っているということです。

短所:スペース/メモリを使い果たしています。

遅延読み込み

逸話はあなたが覚えているのを助けるかもしれません:

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

于 2016-06-08T11:43:43.763 に答える