Мы узнали, что запрос к нашей базе данных — одно из самых трудоемких действий, которые мы можем предпринять. Чрезмерные запросы к базе данных могут легко привести к неэффективности нашего приложения. Особенно, когда мы можем комбинировать несколько методов ActiveRecord вместе, мы можем запускать гораздо больше операторов SQL, чем на самом деле необходимо для данной задачи. Один из методов предотвращения такой неэффективности с помощью процесса, известного как «жадная загрузка».
Нетерпеливая загрузка
Нетерпеливая загрузка запрашивает базу данных для связанных сущностей как часть запроса для первоначально запрошенной сущности. Это означает, что любые потенциально необходимые данные могут быть предварительно кэшированы, что исключает n + 1 запросов (это означает, что мы не делаем ненужных запросов).
#включает
- Чаще всего используется
- Динамический: можно изменить с помощью других методов, таких как #references
- Левое внешнее соединение
Artist.includes(:songs) => SELECT "artists".* FROM "artists" -------------------------------------------------------------------- Artist.includes(:songs).references(:songs) => SELECT "artists"."id" AS t0_r0, "artists"."created_at" AS t0_r1, "artists"."updated_at" AS t0_r2, "songs"."id" AS t1_r0, "songs"."created_at" AS t1_r1, "songs"."updated_at" AS t1_r2 FROM "artists" LEFT OUTER JOIN "songs" ON "songs"."artist_id" = "artists"."id"
#eager_load
- Выполняется только один SQL-запрос
- Левое внешнее соединение
Artist.eager_load(:songs) => SELECT "artists"."id" AS t0_r0, "artists"."created_at" AS t0_r1, "artists"."updated_at" AS t0_r2, "songs"."id" AS t1_r0, "songs"."created_at" AS t1_r1, "songs"."updated_at" AS t1_r2 FROM "artists" LEFT OUTER JOIN "songs" ON "songs"."artist_id" = "artists"."id"
#присоединяется
- Внутреннее соединение
Artist.joins(:songs) => SELECT "artists".* FROM "artists" INNER JOIN "songs" ON "songs"."artist_id" = "artists"."id"
#предварительная загрузка
- Разрешает предварительную загрузку аргументов так же, как это делает #includes
- Запускаются два SQL-запроса
Artist.preload(:songs) => SELECT "artists".* FROM "artists"
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
источники: http://guides.rubyonrails.org/active_record_querying.html#reorder; https://msdn.microsoft.com/en-us/library/jj574232(v =vs.113).aspx ; http://blog.bigbinary.com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html