के साथ प्रतिपादन करना मेरे पास एक क्वेरी है जो कई तालिकाओं को फैलाती है जो अंत में डेटा प्रस्तुत करने के लिए सक्रिय मॉडल सीरियलाइज़र का उपयोग करती हैं। वर्तमान में समय का एक बड़ा हिस्सा धारावाहिकों में बिताया जाता है क्योंकि मुझे धारावाहिक के भीतर से कुछ डेटा पूछने के लिए मजबूर होना पड़ता है। मैं इसे गति देने का एक तरीका खोजना चाहता हूं, और यह एएमएस का उपयोग नहीं कर रहा है (यह ठीक है)।बड़ी डेटा ग्राफ़ क्वेरी को तेज करना और एएमएस
Location
-> Images
-> Recent Images
-> Days Images
Image
-> User
recent_images
और days_images
images
के रूप में, लेकिन एक क्षेत्र के साथ एक ही करने के लिए 6.
वर्तमान में एक where
दिनों से फिल्टर करने के लिए और limit
करने के लिए कर रहे हैं:
मेरे डेटा मॉडल इस प्रकार है इस पूरी प्रक्रिया में स्थानीय रूप से लगभग 15 सेकंड और उत्पादन में 2-4 सेकंड लगते हैं। मुझे लगता है कि मैं इसे बहुत तेज़ कर सकता हूं लेकिन पूरी तरह से सुनिश्चित नहीं हूं कि मैं अपना कोड कैसे संशोधित कर सकता हूं।
क्वेरी लाने के लिए Location
रों है:
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 मणि से है।
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
हाल और दिनों छवियों के लिए स्कोप है:
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 }
मेरा प्रश्न है अगर आपको लगता है मैं एम्स खाई करने के लिए की जरूरत है तो मैं की जरूरत नहीं है इन परिणामों तो serializer जो है हिट serializer में क्वेरी, और यदि हां, तो आप इसे प्रस्तुत करने की सिफारिश कैसे करेंगे?
क्वेरी का धीमा हिस्सा यह है कि धारावाहिक को fetch निष्पादित करना होता है और इसलिए यह एक एन + 1 क्वेरी निष्पादित करता है। स्थानों के लिए क्वेरी आसान है, लेकिन धारावाहिक तब प्रत्येक स्थान के लिए एक क्वेरी, दिन छवियों के लिए 1 और हाल की छवियों के लिए 1 क्वेरी करता है। यह जल्दी से गुब्बारे, और मैं एक आसान समाधान – CWitty
सही खोजने की उम्मीद कर रहा था, मेरा बिंदु खड़ा है - एक बार आपके पास इस तरह की पर्याप्त 3-तरफा क्वेरी है, तो आप एक टेबल बनाते हैं जो सभी खोज परिणामों का प्रतिनिधित्व करता है, जिसे उपयोगकर्ता अपलोड करते समय अपडेट करते हैं एक छवि। अपेक्षाकृत कुछ छवियों को अपलोड किया जा रहा है और बहुत सारे प्रश्न हैं, आप प्रश्नों के लिए अनुकूलित करते हैं और अपलोड पर 'खोज' का काम करते हैं, ट्रिगर्स/कॉलबैक के साथ जो सभी खोज परिणाम तालिका में छवि डालते हैं। – court3nay
आप कुछ चालाक चीज़ों के साथ ऐसा करने में सक्षम हो सकते हैं लेकिन यह आपको बाद में काट देगा। एक नया मॉडल बनाएं जो एक खोज परिणाम का प्रतिनिधित्व करता है और उनमें से एक समूह बनाता है। मॉडल सस्ते हैं, कोड जटिलता और हैक्स कठिन हैं (भविष्य के लिए)। – court3nay