2012-04-10 16 views

Respuesta

41

Eager Loading

Una forma de mejorar el rendimiento es de reducir el número de consultas SQL. Puedes hacerlo a través de la carga ansiosa.

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

Aquí están disparando sólo dos consultas:

1) Uno para todos los usuarios.

2) Uno para todos los amigos de los usuarios.

Lazy Loading:

cuando se tiene un objeto asociado con muchos objetos como un usuario tiene muchos amigos y que desea mostrar una lista como en Orkut que el fuego tantas consultas, ya que hay amigos, más uno para el objeto sí mismo.

users = User.find(:all) 

entonces se le pregunta por cada amigo del usuario, como:

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

Aquí

1) Una consulta para todos los usuarios.

2) N consulta para N no. de usuarios amigos.

echar un vistazo en: Rails 3: Lazy loading versus eager loading

la esperanza de que le ayudará a entender esto.

+8

Comprobar esto también: http://www.spritle.com/ blogs/2011/03/17/eager-loading-and-lazy-loading-in-rails-activerecord/ – Vik

+2

Vik buena y limpia explicación .. –

+3

La carga lenta no es lo mismo que no usar carga ansiosa. '" La carga diferida es un patrón de diseño utilizado comúnmente en la programación de computadoras para retrasar la inicialización de un objeto hasta el punto en que se necesita. Puede contribuir a la eficiencia en el funcionamiento del programa si se utiliza de forma adecuada ". -Wikipedia' Básicamente si su página tiene un montón de imágenes que un usuario no ve hasta que se desplaza, puede esperar hasta que se desplace y verá la imagen para cargarlo. Eso es una carga floja. –

5

carga Eager

cargas de sus armas (como en Vicksburg) y simplemente esperar hasta que realmente se necesita para usarlo. Esta es una política de carga ansiosa.

Pro: es que todo está listo para funcionar.

Con: está usando espacio/memoria.

Lazy Loading

Un joven guardiamarina preguntó Lord Nelson por qué no estaba preparando sus barcos:

"No voy a cargar mis armas principios ....... I' Cargaré solo 1 microsegundo antes de tener que dispararlo ". él dijo. Esta es una política de carga diferida.

Pro de lazy la carga: no golpear la base de datos hasta que lo necesite.

Con: Alcanzará la base de datos N + 1 veces ..... a menos que seleccione exactamente la columna que desea y la alia. p.ej.

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

Golpear la base de datos una sola vez con una política de carga diferida:

La consulta anterior golpea el 1 Tiempos base de datos de N + cuando se llama product.category.name en la plantilla de vista - donde el producto es un solo objeto dentro de la relación @products. Pero si un alias, puede hacerlo todo con una sola consulta:

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

Y utilizar de esta manera: product.category_name

Cuestiones relacionadas