2012-07-30 51 views
2

在哪一點上可以對大型項目進行所有查詢以加載所有對象關聯?
讓我來解釋一下這個問題的背景。
目前我正在研究一個在模型和關聯方面變得相當複雜的項目。我開始檢查服務器日誌,發現一些視圖需要一些時間來加載,因爲查詢中包含的嵌套對象。
所以我開始重構某些查詢的到這樣的事情:什麼時候Rails Eager默認加載所有關聯是一個好主意?

@process = current_account.processes.query(params) 

要這樣:

@process = current_account.processes.includes(:messages, :parts, :people).query(params) 

結果是相當不錯的。在某些視圖中,我能夠將視圖渲染時間和主動記錄查詢時間縮短70%。
我很高興的人,所以我決定做更多。但是在做出這個決定之後,我開始注意到並非所有地方都重構了代碼,這些變化都很好。事實上,有些查詢變得更慢。
要解釋一下關於這個問題我有這樣一個模型:

​​

而且裏面processbelongs_to :user創建它像這樣這些嵌套模式中的每一個:

class Anotation 
    belongs_to :user 

class Reunion 
    belongs_to :user 

class Profile 
    belongs_to :user 

它去上。
在我的show viewprocess中,有幾個選項卡顯示這些嵌套對象的全部以及將其添加到當前進程的用戶的名稱。
有了這樣的查詢:

@process = current_account.processes.query(params) 

它執行有點慢。所以,我想是這樣的:

@process = current_account.process.includes(:anotations, :publications, :movimentations, 
    :reunions, :profiles, :messages).query(params) 

這使我獲得的視圖渲染速度,但在ActiveRecord的,在時間檢索這些對象已顯著上升。而且它提出的天空時,我渴望加載的process所有嵌套模型這樣的內部user對象:

@process = current_account.process.includes({:anotations => [:user]}, 
    {:publications => [:user], etc...).query(params) 

好,重構應用程序的設計,這些協會不同的行爲是不會發生的,所以我再問這個問題。
在哪一點很好,使大型項目上的所有查詢加載所有的對象關聯?
關於這個問題的任何提示/最佳實踐/經驗將非常感激。

+0

我建議一個標題,如「什麼時候Rails加載默認情況下所有關聯都是一個好主意? – lulalala 2013-03-12 08:20:12

回答

1

「大型項目上的所有查詢都急切地加載所有對象關聯」 - 幾乎從不。至少在應用程序內部沒有幫助。

如果我在你的鞋子裏,我會開始尋找緩存(你沒有提到,所以我不知道你是否在做任何)。特別是碎片緩存,因爲它看起來很適合你的標籤結構。

在一個應用程序中,我使用上下文相關的側邊欄來顯示項目組列表,每個組包含指向相關項目的鏈接(18個組中的任意組中的n個項目),每個項目顯示相關項目的名稱鏈接表單(和其他一些小數據項)。

緩存側邊欄中的每個組,同時緩存組中每個相關項目的條目。重構控制器以將相關項目累積爲@relateds,並且該代碼使用緩存來確定提取是否有必要(在緩存未命中時)。在智能緩存過期中有一點點工作,性能非常好。

假設Project X在12個類別(120個相關項目)中分別有10個相關項目。在第一個項目X展會上,您付出了代價。更改某個類別中1個相關項目的名稱會使該項目,該項目的組以及整個側邊欄的緩存失效。在Project X的下一個展示中,重構側邊欄涉及1個項目的緩存未命中(使用一個或兩個連接讀取該項目的記錄),以便重建項目緩存,從10個項目緩存重建一個緩存(1新的+9現有),其他11個類別的緩存命中(不讀取這110個相關的項目),並在最後得到重建的側邊欄緩存。

感覺就像你可以爲你的標籤採用類似的策略,也許更細粒度,但這取決於你的實現。

+1

這是一個很好的觀點。我從來沒有考慮過緩存機制,所以我想我會檢查出來。你有一些很好的緩存材料來源(教程/文檔/等)? – MurifoX 2012-07-30 16:53:08

+1

我從事他的研究已經有一段時間了,但快速瀏覽產生了這篇文章,這似乎涵蓋了相當不錯的話題... http://broadcastingadam.com/2011/05/advanced_caching_in_rails/ – railsdog 2012-07-30 17:16:33

+0

Thx,我會一探究竟。 – MurifoX 2012-07-30 17:18:46

相關問題