无法优化控制器中的Rails查询

时间:2013-05-31 00:34:26

标签: ruby-on-rails optimization activerecord

我似乎无法弄清楚为什么我的总渲染时间与我的生产日志中列出的活动记录时间+我的观看时间不匹配。

这是我的生产日志的输出:

12508ms完成200 OK(浏览次数: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

所有代码都在运行,我不确定我是否可以提高效率。令我困惑的是,为什么总页面加载时间甚至不接近运行查询所需的时间。谁能帮我吗?请??该页面在技术上应该在不到50ms的时间内加载,但它需要12508ms!

非常感谢任何帮助!

---------- ------------ UPDATE 我从我的服务器运行顶部并注意到在这些查询期间ruby占用了100%的CPU。这里有什么想法?也许这指向了这个问题......?

1 个答案:

答案 0 :(得分:2)

很可能在控制器中渲染到JSON的时间太长了。您要渲染多少条记录? 如果您的Ruby进程占用了所有可用的CPU,这意味着它不(直接)与您的数据库相关,但可能是以下任何一个:

  • 从数据库中实例化对象(如果要检索10,000个记录);
  • 将这些对象渲染为JSON。

查看您的页面加载时间(Views: 0.3ms | ActiveRecord: 46.0ms)我会说这是对JSON的渲染。它不会显示在Views下,因为您没有使用任何视图,只是直接在控制器中调用渲染操作。

我建议您在应用程序中添加一些工具(例如New Relic RPM),或者甚至是简单的基准测试方法,以找出需要花费这么长时间的工具。

您可能还想考虑使用更快的JSON解析器/渲染器而不是默认的解析器/渲染器。查看multi_json gem。