2013-05-31 11 views
3

我似乎無法弄清楚爲什麼我的總渲染時間與我的生產日誌中列出的活動記錄時間+我的視圖時間不匹配。無法優化控制器中的Rails查詢

這裏是從我的生產日誌輸出:

完成200 OK在12508ms(瀏覽次數:0.3ms的| ActiveRecord的:46.0​​ms)

這裏是在我的控制器代碼:

store = Store.find(:vanity_url => params[:vanity_url]) 
render :json => store.get_pages_with_includes 
return false 

在我的Store.rb模型中,有兩種方法用於呈現模型的json表示及其所有活動關係。這裏是預先加載方法:

def eager_load_pages 
    pages = Page.where(:store_id => self.id).includes(
     [{:menu_items => 
      [ 
       :sizes, 
       {:topping_groups => 
        {:toppings => :sizes} 
       } 
      ] 
     }, 
     {:combos => 
      {:combo_item_groups => 
       {:combo_items => 
        [ 
         :sizes, 
         {:topping_groups => 
          {:toppings => :sizes} 
         } 
        ] 
       } 
      } 
     }] 
    ).order('position ASC') 
    return pages 
end 

這裏是to_json方法

def get_pages_with_includes 
    pages = self.eager_load_pages 
    return pages.to_json({:include => 
     [{:menu_items => 
      {:include => 
       {:topping_groups => 
        {:include => 
         {:toppings => 
          {:include => 
           :sizes 
          } 
         } 
        } 
       } 
      } 
     }, 
     {:combos => 
      {:include => 
       {:combo_item_groups => 
        {:include => 
         {:combo_items => 
          {:include => 
           [:sizes, :topping_groups => 
            {:include => 
             {:toppings => 
              {:include => 
               :sizes 
              } 
             } 
            } 
           ] 
          } 
         } 
        } 
       } 
      } 
     }] 
    }) 
end 

所有代碼的工作,我不知道如果我能使其更有效率。我感到困惑的是爲什麼總頁面加載時間甚至不接近運行我的查詢所花費的時間。誰能幫我嗎?請??頁面在技術上應該在小於50毫秒的時間內加載,但其耗時12508毫秒!

任何幫助將不勝感激!

---------- UPDATE ------------ 我跑過了我的服務器,發現在這些查詢過​​程中,ruby佔用了100%的CPU。這裏有什麼想法?也許這指出了這個問題......?

回答

2

最有可能在您的控制器中呈現JSON格式的時間太長。您嘗試渲染多少條記錄? 如果你的Ruby進程佔用了所有可用的CPU,這意味着它不(直接)與您的數據庫,但可以是任何這些:

  • 從數據庫實例化對象(如果你的記錄檢索10,000s );
  • 將這些對象呈現給JSON。

看着你的頁面加載時間(Views: 0.3ms | ActiveRecord: 46.0ms)我想說這是對JSON的渲染。它不會在Views下顯示,因爲您沒有使用任何視圖,而是直接在控制器中直接調用渲染操作。

我建議你在你的應用程序中添加一些工具(比如New Relic RPM)或者甚至簡單的基準測試方法來找出需要花費的時間。

您可能還想考慮使用更快的JSON解析器/渲染器,而不是默認的JSON解析器/渲染器。查看multi_json寶石。

+0

此回覆非常翔實!謝謝你澄清!我將檢查multijson gem,因爲json是目前唯一的其他渲染。有沒有更好的方法來收集所有活躍的關係,並將它們發送到JavaScript的收藏視圖? –

+0

數據庫檢索正常。只是一些不必要的返回語句請記住,如果沒有明確的返回值,Ruby方法將返回最後一條語句的值。因此'eager_load_pages'不需要變量賦值和返回語句。您可以查看'jbuilder'或類似的JSON視圖構建器,而不是使用大的'render'調用構建適當的視圖。但他們當然也會帶來一些小的開銷。 – tieleman

+0

這是偉大的建議!調查jbuilder,它似乎可能適用於我。對我來說唯一的麻煩是一旦我渴望加載一個對象,我真的需要所有的數據嵌套密集數組。但即使在加載之後,似乎當我嘗試構建自己的數組時,它會重新運行查詢並導致很大的延遲。這就是爲什麼要使用.to_json方法。 jbuilder能解決這個問題嗎?這意味着,它是否會以一種讓我無法重新運行查詢的方式與熱切加載的模型進行交互? –