içerir olduğu gibi belleğe tüm ilişkili kayıtları yük:ActiveRecord kullanım performansı için katılır ama yanılmışsam sürece
joins
birinner join
includes
nedenleri nedenleri:joins
çünkü veritabanı seviyesindeincludes
daha iyi performansa sahiptir birsubquery
Ve genel olarak, bir inner join
birdaha hızlıdır.
Örnek:
#app/models/owner.rb
class Owner < ActiveRecord::Base
has_many :pets
end
#app/models/pet.rb
class Pet < ActiveRecord::Base
belongs_to :owner
end
rails console
kullanma: neredeyse her zaman daha iyi olurdu gibi
irb(main):001:0> @owners = Owner.all.joins(:pets)
Owner Load (0.3ms) SELECT "owners".* FROM "owners" INNER JOIN "pets" ON "pets"."owner_id" = "owners"."id"
görünüşe:
# showing how 'includes' in rails causes an IN statement which is a subquery
irb(main):001:0> @owners = Owner.all.includes(:pets)
Owner Load (2.7ms) SELECT "owners".* FROM "owners"
Pet Load (0.4ms) SELECT "pets".* FROM "pets" WHERE "pets"."owner_id" IN (1, 2, 3)
Ve şimdi joins
kullanarak hangi bir inner join
neden olurüzerinden joins
kullanın Çünkü:
includes
birsubquery
(IN
deyimi) neden olurjoins
genellikle alt sorgu Ancak
daha hızlı bir inner join
neden olur joins
kullanarak bir yakaladım yoktur. This article does a great job describing it. Temel olarak, includes
tüm ilişkili nesneleri belleğe yükler, böylece ilişkili nesnelerin özelliklerinden herhangi birini sorgularsanız, veritabanına vurmaz. Bu arada, joins
, ilişkili nesnelerin özniteliklerine bellek yükler, bu nedenle, özniteliklerden herhangi birini sorgularsanız, veritabanında ek isabetler yapar.
İşte benim sorum: Performans için joins
gibi iç birleştirme yapmak mümkün ama aynı zamanda tüm ilişkili nesneleri includes
gibi belleğe yüklemek mümkün mü?
Başka bir deyişle: tüm ilişkili nesneleri includes
gibi belleğe yüklemek mümkün mü, ancak bir alt sorgunun aksine bir iç birleştirmeye neden olur?