Почему мой запрос к базе данных Ruby On Rails выполняется так медленно?

#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-3.1

#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-3.1

Вопрос:

Следующий код всегда использует более десяти секунд. Я обновил сервер, но это не помогает. Я знаю, что у меня есть некоторые проблемы с дизайном базы данных, но я не могу это изменить.

Я показываю все цены из разных местоположений продуктов категории также в разном временном диапазоне, потому что цены меняются каждые 15 дней в каждом местоположении.

контроллер

 def prods_x_cat
 # This will load all the products of a category
 @products =  Product.prods_x_cat(params[:id],:include => :raw_datas)
 @cortes = RawData.cortes
  respond_to do |format|
    format.js { render :layout=>false}
  end
end
  

prods_x_cat.js.erb

  var jqxhr1 = $.ajax($("#loading_overlay .loading_message, #loading_overlay").fadeIn());
 $('#datos').html("<%= escape_javascript render :partial=>'/shared/prods_x_cat'%>")
  

Вид

     <%@cortes.each do |c|%>
  <a href="#<%=c.corte%>" class="round_top"><%=c.corte%></a>
    <%end%>
    <%@cortes.each do |c|%>
     <%@fecha = c.corte_real%>
     <div id="<%=c.corte%>" class="block no_padding">
     <table class="display datatable">
    <thead>
    <tr>
      <th>SKU</th>
            <%Company.active.order('table_field ASC').each do |c|%>
                <th><%=c.abbr%></th>
            <%end%>
      <th>Average</th>
      <th>Mode</th>
      <th>Minimum</th>
      <th>Maximum</th>
     </tr>
    </thead>
    <tbody>
    <%@products.each do |p|%>
     <tr class="gradeA">
    <td><%=p.name%></td>
    <%p.raw_datas.where("product_id='#{p.id}' and corte_real='#{@fecha}'").each do |prd|%>
      <td><%=prd.location1.to_f.round(2)%></td>
      <td><%=prd.location2.to_f.round(2)%></td>
      <td><%=prd.location3.to_f.round(2)%></td>
      <td><%=prd.location4.to_f.round(2)%></td>
      <td><%=prd.location5.to_f.round(2)%></td>
      <td><%=prd.location6.to_f.round(2)%></td>
      <td><%=prd.location7.to_f.round(2)%></td>
      <td><%=prd.location8.to_f.round(2)%></td>
      <td><%=prd.promedio.to_f.round(2)%></td>
      <td><%=prd.moda%></td>
      <td><%=prd.minimo.to_f.round(2)%></td>
      <td><%=prd.maximo.to_f.round(2)%></td>
     <%end%>
     </tr>
    <%end%>
    </tbody>
    </table>
   </div>
   <%end%>
   </div> 
  

Ответ №1:

На такого рода вопросы практически невозможно ответить, не просмотрев весь задействованный код. Вместо этого я могу помочь вам попытаться выяснить, в чем проблема.

Есть хорошие инструменты для определения того, где у вас проблемы с производительностью (например, ruby-prof), но если вам нужен быстрый примитивный способ найти, в чем ваша проблема, просто используйте Time.now . Например, вы могли бы изменить действие вашего контроллера на:

 def prods_x_cat
 # This will load all the products of a category
 a1 = Time.now
 @products =  Product.prods_x_cat(params[:id],:include => :raw_datas)
 b1 = Time.now
 p "Time for finding products: #{b1 - a1}"
 a2 = Time.now
 @cortes = RawData.cortes
 b2 = Time.now
 p "Time for finding cortes: #{b2 - a2}"
 respond_to do |format|
   format.js { render :layout=>false}
 end
end
  

Если распечатки показывают, что время тратится в другом месте, начните делать что-то подобное в своем шаблоне. Сосредоточьтесь на вызовах базы данных.

Комментарии:

1. да, я только что установил NewRelic, проблемы связаны с вызовами базы данных, ОС, я должен найти способ выполнять меньше запросов, но я не знаю как, может быть, если я смогу сохранить свои запросы в объекте, повторите его. Потому что каждый раз, когда я выполняю итерацию по объекту, который вызвал DB, я вижу в журнале, что вызов выполнен в database