2012-04-10 16 views

Antwort

41

Eager Loading

Eine Möglichkeit zur Verbesserung der Leistung ist auf die Anzahl der SQL-Abfragen zu reduzieren. Sie können dies durch eifriges Laden tun.

User.find(:all, :include => :friends) 

Hier schießen Sie nur zwei Abfragen:

1) Eine für alle Benutzer.

2) Einer für alle Freunde der Benutzer.

Lazy Loading:

Wenn Sie ein Objekt im Zusammenhang mit vielen Objekten wie ein Benutzer viele Freunde hat und Sie möchten eine Liste anzuzeigen, wie in Orkut Sie so viele Anfragen feuern wie es Freunde sind, plus eine für das Objekt selbst.

users = User.find(:all) 

Dann für jeden Benutzer Freund fragen, wie:

users.each do |user| 
    friend = Friend.find_by_user_id(user.id) 
end 

Hier

1) Eine Abfrage für alle Benutzer.

2) N-Abfrage für N-Nr. von Freunden der Benutzer.

Werfen Sie einen Blick auf: Rails 3: Lazy loading versus eager loading

Hoffnung, dass Sie dies verstehen helfen.

+8

prüfen dies auch: http://www.spritle.com/ blogs/2011/03/17/eifrig-laden-und-lazy-loading-in-schienen-activerecord/ – Vik

+2

Vik nett und sauber Erklärung .. –

+3

Lazy Laden ist nicht das gleiche wie nicht mit eifrigen Laden. '" Lazy Loading ist ein Entwurfsmuster, das häufig in der Computerprogrammierung verwendet wird, um die Initialisierung eines Objekts auf den Zeitpunkt zu verzögern, an dem es benötigt wird. Es kann zur Effizienz im Programmablauf beitragen, wenn es ordnungsgemäß verwendet wird. " -Wikipedia' Wenn Ihre Seite eine Reihe von Bildern hat, die ein Benutzer nicht sehen kann, bis er scrollt, können Sie warten, bis er scrollt und das Bild sehen wird, um es zu laden. Das ist faules Laden. –

5

Eager Laden

Ihre Waffen Lasten (wie in Vicksburg) und nur warten, bis Sie es tatsächlich verwenden müssen. Dies ist eine Politik des eifrigen Ladens.

Pro: Ist alles bereit zu gehen.

Con: Sie verbrauchen Speicherplatz/Speicher.

Lazy Loading-

Ein junger fragte Seekadett Lord Nelson, warum er nicht seine Schiffe vorbereitet wurde:

„Ich werde meine Waffen früh nicht geladen werden ....... Ich lch lade nur 1 Mikrosekunde bevor ich es abfeuern muss. " er sagte. Dies ist eine Richtlinie zum verzögerten Laden.

Pro Lazy Loading: Sie treffen die Datenbank nicht, bis Sie müssen.

Con: Sie werden die Datenbank N + 1 mal schlagen ..... es sei denn, Sie wählen genau die Spalte, die Sie wollen, und Sie alias es. z.B.

@products = Product.order("categories.name").joins(:category) 

nur einmal die Datenbank Schlagen mit einer faulen Laden Politik:

Die obige Abfrage trifft auf die Datenbank N + 1-mal, wenn Sie product.category.name in der Ansichtsvorlage nennen - wo Produkt ein einzelnes Objekt innerhalb der @ products-Beziehung. Aber wenn Sie es alias, können Sie alles mit nur einer Abfrage getan:

@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name") 

und verwenden Sie es wie folgt aus: product.category_name