2011-05-20 44 views
1

在Rails控制器的動作我打電話慢找到包括多個關聯

@grid = Grid.find(params[:id], :include => [:grid_properties, :grid_entities => [:entity => :properties]]) 

不幸的是它需要很長的。 Benchmark.realtime(在開發模式下)告訴我1.8812830448150635,所以大概2秒(Rails 3.0.7,Postgres 8.4)。

當在SQL日誌我得到這行代碼下面轉向:

Grid Load (0.9ms) SELECT "grids".* FROM "grids" WHERE "grids"."id" = 2 LIMIT 1 
GridProperty Load (2.5ms) SELECT "grid_properties".* FROM "grid_properties" WHERE ("grid_properties".grid_id = 2) ORDER BY row_order 
GridEntity Load (1.3ms) SELECT "grid_entities".* FROM "grid_entities" WHERE ("grid_entities".grid_id = 2) ORDER BY row_order 
Entity Load (3.0ms) SELECT "entities".* FROM "entities" WHERE ("entities"."id" IN (28,7,3,6,25,11,2,12)) 
Property Load (6.4ms) SELECT "properties".* FROM "properties" WHERE ("properties".entity_id IN (28,7,3,6,25,11,2,12)) 

每個數據庫的訪問似乎是在低毫秒範圍內。爲什麼最後需要這麼長時間?

+0

「Benchmark.realtime」僅用於查詢還是包含渲染部分和模板所需的時間? – Wukerplank 2011-05-20 10:33:36

+0

就在上面找到。沒有其他包含。 – Zardoz 2011-05-20 10:50:14

回答

1

我想,時間花在Ruby創建對象上。該網格中有多少個屬性? 'SELECT FROM properties'的時間看起來相對較高。

你可以進一步調查的問題,如果你有一些功能,你可以將檢查點 - logger.debug "CHECKPOINT: #{Time.now} #{caller(0).first}"

你有任何「ON_LOAD」回調,也許?

+0

每個實體大約有50個屬性,但沒有on_load回調。 Puh,這幾乎是創建一些Ruby對象的時間(但我沒有任何比較值)。也許我應該直接訪問數據而根本不創建Ruby對象。 – Zardoz 2011-05-20 12:13:08

+0

直接訪問肯定會更快,但代碼的可讀性會降低(大多數情況下)。如果你有很好的測試覆蓋率,那麼它應該是安全的。加載此數據時,您可能還需要測量內存使用情況。 Maye會顯示一些有趣的內容嗎? – Arsen7 2011-05-20 12:42:57

+0

內存使用也沒什麼特別的。每個屬性只包含5個字符串字段,其中每個字段包含大多數小於50個字符。所以我猜想多重關聯的原因並不是ActiveRecord的一個好用例。我會嘗試直接訪問數據,看看它有什麼不同。謝謝您的幫助。 – Zardoz 2011-05-20 13:00:24