ile büyük veri grafiği sorgulaması ve oluşturulmasını hızlandırma Sonunda, verileri oluşturmak için Active Model Serileştiricileri kullanan birden çok tablo içeren bir sorgu var. Halihazırda zamanın büyük bir kısmı serileştiricilerde harcanmaktadır, çünkü seri hale getiricinin içinden gelen bazı verileri sorgulamak zorunda kalıyoruz. Bunu hızlandırmak için bir yol bulmak istiyorum ve bu AMS kullanmıyor olabilir (bu iyi bir şey).AMS
Location
-> Images
-> Recent Images
-> Days Images
Image
-> User
recent_images
ve days_images
anda 6.
bir gün filtrelemek için where
ve limit
yapmak images
olarak değil, kapsamı ile aynıdır şu şekildedir:
Benim veri modeli Bu işlem yerel olarak yaklaşık 15 saniye ve üretimde 2-4 saniye sürer. Bu kadar hızlı çalışabiliyormuşum gibi hissediyorum, ancak kodumu nasıl değiştirebileceğime emin değilim.
sorgu
Location
s getirmesi:
ids = @company
.locations
.active
.has_image_taken
.order(last_image_taken: :desc)
.page(page)
.per(per_page)
.pluck(:id)
Location.fetch_multi(ids)
fetch_multi
identity_cache mücevher değil.
class V1::RecentLocationSerializer < ActiveModel::Serializer
has_many :recent_images, serializer: V1::RecentImageSerializer do
if scope[:view_user_photos]
object.fetch_recent_images.take(6)
else
ids = object.recent_images.where(user_id: scope[:current_user].id).limit(6).pluck(:id)
Image.fetch_multi(ids)
end
end
has_many :days_images do
if scope[:view_user_photos]
object.fetch_days_images
else
ids = object.days_images.where(user_id: scope[:current_user].id).pluck(:id)
Image.fetch_multi(ids)
end
end
end
son ve günleri görüntüler için kapsamları geçerli:: Eğer ben o yüzden gerek yok AMS hendek gerekir düşünüyorsanız
scope :days_images, -> { includes(:user).active.where('date_uploaded > ?', DateTime.now.beginning_of_day).ordered_desc_by_date }
scope :recent_images, -> { includes(:user).active.ordered_desc_by_date }
Benim sorum Bu sonuçlar daha sonra seri hale vurmak serializer'da sorgulayın ve eğer öyleyse, bunu nasıl oluşturmanızı önerirsiniz?
Sorgunun yavaş kısmı, serializer'ın getirmeyi gerçekleştirmesi ve dolayısıyla bir N + 1 sorgusu gerçekleştirmesidir. Konumlar için sorgulama kolaydır, ancak serileştiriciler daha sonra her bir konum için bir sorgulama yapar, 1 gün görüntüleri için 1 ve son görüntüler için 1'dir. Hızlı bir şekilde balonluyor ve – CWitty
daha kolay bir çözüm bulmayı umuyordum, benim nokta standlarım - böyle bir şekilde yeterince büyük 3 yönlü bir sorguya sahip olduğunuzda, bir kullanıcı karşıya yüklediğinde güncellediğiniz tüm arama sonuçlarını gösteren bir tablo oluşturuyorsunuz bir şekil. Nispeten az sayıda resmin yüklendiğini ve çok sayıda sorgunun olduğunu varsayarak, sorguları optimize eder ve görüntüyü tüm arama sonucu tablolarına ekleyen tetikleyiciler/geri aramalarla, yükleme sırasında 'arama' işlemini yaparsınız. – court3nay
bunu akıllıca bir şeyle yapabilirsin ama bu daha sonra seni ısırır. Bir arama sonucunu temsil eden ve bunların bir demetini oluşturan yeni bir model oluşturun. modeller ucuz, kod karmaşıklığı ve hack zor (gelecek için). – court3nay