Подтвердить что ты не робот

Интенсивная загрузка и ленивая загрузка в рельсах

Я запутался в загрузке и ленивой загрузке, есть ли разница в производительности запросов на рельсы?

Есть ли способ реализовать оба пути?

4b9b3361

Ответ 1

Оживленная загрузка

Одним из способов повышения производительности является сокращение количества SQL-запросов. Вы можете сделать это с помощью активной загрузки.

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

Здесь вы запускаете только два запроса:

1) Один для всех пользователей.

2) Один для всех друзей пользователей.

Lazy Loading:

Когда у вас есть объект, связанный со многими объектами, такими как Пользователь имеет много друзей, и вы хотите отобразить список, как в Orkut, вы запускаете столько запросов, сколько есть друзей, плюс один для самого объекта.

users = User.find(:all)

Затем запрос для каждого пользователя-друга, например:

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

Здесь

1) Один запрос для всех пользователей.

2) N запрос для N no. друзей пользователей.

Взгляните на: Rails 3: ленивая загрузка по сравнению с загружаемой загрузкой

Надеюсь, что это поможет вам понять это.

Ответ 2

Нежелательная загрузка

Загружает оружие (например, в Виксбурге) и просто ждите, пока вам не понадобится его использовать. Это политика нетерпеливой загрузки.

Pro: все готово к работе.

Con: вы используете пространство/память.

Lazy Loading

Молодой военно-морской кадет спросил лорда Нельсона, почему он не готовит свои корабли:

"Я не буду загружать свои ружья рано... Я загружу всего 1 микросекунду, прежде чем мне нужно ее запустить". он сказал. Это ленивая политика загрузки.

Pro от ленивой загрузки: вы не попадаете в базу данных, пока вам это не понадобится.

Con: вы будете бить базу данных N + 1 раз..... если вы не выберете точно нужный столбец, и вы будете его псевдонимом. например.

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

Включение базы данных только один раз с ленивой политикой загрузки:

Вышеуказанный запрос попадает в базу данных N + 1 раз, когда вы вызываете product.category.name в шаблоне вида - где продукт является единственным объектом в отношении @products. Но если вы его используете, вы можете сделать все с помощью только одного запроса:

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

И используйте его вот так: product.category_name