2017-07-31 22 views
1

我有一個非常緩慢的查詢,看起來像這樣:什麼是我可以減少的一種方式,包括關聯查詢?

people = includes({ project: [{ best_analysis: :main_language }, :logo] }, :name, name_fact: :primary_language) 
       .where(name_id: limit(limit).unclaimed_people(opts)) 

看那includes方法調用,並通知正在加載協會的數量巨大。在RailsSpeed書,有以下報價:

「例如,考慮一下:

Car.all.includes(:drivers, { parts: :vendors }, :log_messages) 

多少ActiveRecord對象可能會在此實例?

答案是:

# Cars * (avg # drivers/car + avg log messages/car + average parts/car * (average parts/vendor)) 

每個渴望負荷增加實例化對象的數量,進而減慢查詢。如果不使用這些對象,則可能會不必要地減慢查詢速度。請注意,嵌套的熱切加載(上面示例中的部件和供應商)可以真正增加實例化的對象數量。

小心你的渴望負荷築巢,始終與生產數據進行測試,看看是否包括被真正加快你的整體性能。」

書中沒有提到這可能是一個很好的替代這個雖然。所以我的問題是我可以用什麼技術替代includes

+0

您是否正在檢索您包含的所有關係? –

+0

如果你的意思是我是否正在使用我包含的所有關係,那麼是的。這些模型是需要一個視圖。 –

回答

0

在我跳回答之前。我沒有看到你使用任何分頁或查詢限制,這可能會有很大幫助。

不幸的是,沒有任何,真的。如果您在視圖中使用所有對象,那就沒問題。雖然有一個可能的替代品includes。它非常複雜,但它有時還是有用的:你加入所有需要的表格,只選擇你使用的表格中的字段,將它們別名並作爲平面結構訪問它們。

喜歡的東西

(注:它使用AREL幫手你需要在你使用類似語法NameFact[:id]模型include ArelHelpers::ArelTable

relation.join(name_fact: :primary_language).select(
    NameFact[:id].as('name_fact_id') 
    PrimaryLanguage[:language].as('primary_language') 
) 

我不知道它會爲你的工作情況,但這是我知道的唯一選擇。

0
I have an extremely slow query that looks like this 

有幾個可能的原因:獲取和創建

  1. 太多不必要的對象。從你的評論看來,情況並非如此,你需要獲取所有的數據。

  2. 數據庫索引未優化。檢查查詢所花費的時間。 Explain生成的查詢(檢查日誌以獲取查詢或.to_sql)並確保它沒有執行表掃描和其他昂貴的操作。

+0

對於#2,ActiveRecord內置了[說明](http://guides.rubyonrails.org/active_record_querying.html#running-explain) –

相關問題