Я запутался в загрузке и ленивой загрузке, есть ли разница в производительности запросов на рельсы?
Есть ли способ реализовать оба пути?
Я запутался в загрузке и ленивой загрузке, есть ли разница в производительности запросов на рельсы?
Есть ли способ реализовать оба пути?
Одним из способов повышения производительности является сокращение количества SQL-запросов. Вы можете сделать это с помощью активной загрузки.
User.find(:all, :include => :friends)
Здесь вы запускаете только два запроса:
1) Один для всех пользователей.
2) Один для всех друзей пользователей.
Когда у вас есть объект, связанный со многими объектами, такими как Пользователь имеет много друзей, и вы хотите отобразить список, как в 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: ленивая загрузка по сравнению с загружаемой загрузкой
Надеюсь, что это поможет вам понять это.
Нежелательная загрузка
Загружает оружие (например, в Виксбурге) и просто ждите, пока вам не понадобится его использовать. Это политика нетерпеливой загрузки.
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