簡體   English   中英

如何改善這些查詢的性能?

[英]How do I improve these queries' performance?

我有一個很長的復雜主頁,其中顯示了一個公司的每個項目的最新事件信息。 他們的想法是,他們擁有一種數據繁重的信息中心,可以從中監視所有活動。

我很難讓此頁面正常運行-兩天前本地加載時間為4.5s(!),目前為2.5s(!)。 關於這種可怕的性能,最令人擔憂的部分是這些是只有3個項目且幾乎沒有任何事件的加載時間。 實時應用程序的性能稍好一些,但還不夠。

目的:縮短主頁上的加載時間

這是當前查詢。

# controller
@projects = @company.projects.order("project_title ASC").includes({:events => :owner}).search(params[:search], params[:page])

# view
@projects.each do |project|
  @events = project.events.where(:active => true).includes(:owner).order("priority DESC")
end

在總共只有3個項目和4個事件的應用上,刪除.where(:active => true).includes(:owner).order("priority DESC")可以節省1.1秒。

這些查詢應如何最佳地編寫? 在這種情況下,索引應該發揮作用嗎?

我一直在為視圖中的循環查詢使用數據庫索引,但是還沒有一個可以減少時間的。

您的.includes(:events =>:owners)並沒有按照您的想法進行操作,因為當您稍后調用.where事件時,您必須再次從數據庫中檢索。

另外,如果您的搜索方法使用的是events and owner表,則可能需要使用.joins()而不是.includes()。

我將確保您在每個外鍵(xxx_id)和活動事件上都有索引。

我也可以試一下(不確定是否可行,可能需要一些調整):

class Project < AR::Base
  has_many :events
  has_many :active_events,
    :class_name => 'Event',
    :conditions => {:active => true},
    :order => "events.priority DESC"
    :include => :owner
end

#in controller:
@projects = @company.projects.order("project_title ASC").includes(:active_events).search(...)


#in view: (abstract this to a render collection method if possible)
@project.each do |project|
  @events = project.active_events
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM