2012-04-10 20 views

risposta

41

Eager Loading

Un modo per migliorare le prestazioni è quello di ridurre il numero di query SQL. Puoi farlo attraverso il caricamento avido.

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

Qui si sparano solo due domande:

1) Uno per tutti gli utenti.

2) Uno per tutti gli amici degli utenti.

Lazy Loading:

quando si ha un oggetto associato con molti oggetti come un utente ha molti amici e si desidera visualizzare un elenco come in Orkut si spara come molte domande come ci sono gli amici, più uno per l'oggetto si.

users = User.find(:all) 

Poi query per ogni amico utente, come:

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

Qui

1) Una domanda per tutti gli utenti.

2) N query per N no. di amici amici.

dare uno sguardo su: Rails 3: Lazy loading versus eager loading

speranza che vi aiuterà a capire questo.

+8

controllare anche questo: http://www.spritle.com/ blog/2011/03/17/eager-loading-and-lazy-loading-in-rails-activerecord/ – Vik

+2

Vik bella e pulita spiegazione .. –

+3

Il caricamento lento non è la stessa cosa di non usare il caricamento ansioso. '' Il caricamento lento è un modello di progettazione comunemente utilizzato nella programmazione di computer per posticipare l'inizializzazione di un oggetto fino al punto in cui è necessario.Esso può contribuire all'efficienza nel funzionamento del programma se opportunamente e adeguatamente utilizzato. " -Wikipedia' Fondamentalmente se la tua pagina ha un gruppo di immagini che un utente non vede fino a quando non scorre, puoi aspettare che scenda verso il basso e vedrà l'immagine per caricarlo. Questo è il caricamento pigro. –

5

eager loading

carica il pistole (come a Vicksburg) e aspettare fino a quando hai veramente bisogno di usarlo. Questa è una politica di caricamento avido.

Pro: è tutto pronto per partire.

Con: si sta consumando spazio/memoria.

caricamento pigro

Un giovane cadetto di marina chiese Lord Nelson perché non stava preparando le sue navi:

"Non voglio caricare le mie pistole presto ....... io' Caricherò solo 1 microsecondo prima che sia necessario spararlo. " Egli ha detto. Questa è una politica di caricamento lenta.

Pro di caricamento lazy: non si colpisce il database finché non è necessario.

Contro: Avrai colpito il database N + 1 volte ..... a meno che tu non selezioni esattamente la colonna che desideri e tu la alias. per esempio.

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

Colpire il database solo una volta con una politica di lazy loading:

La query sopra colpisce il database di N + 1 volte quando si chiama product.category.name nel modello di vista - dove il prodotto viene un singolo oggetto all'interno della relazione @products. Ma se l'alias, si può fare tutto con una sola query:

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

e usarlo in questo modo: product.category_name