3

自分のアプリケーション (ruby 1.9.3 p194、rails 3.2.8、および pg 0.14.0 を実行) で rack-mini-profiler を使用すると、非常に奇妙な分析出力が得られます。通常、次のようになります。

/da/brugte-biler/Fiat/Multipla autouncle.dev on Mon, 27 Aug 2012 13:30:50 GMT
                                             duration (ms) from start (ms) query time (ms)
GET http://autouncle.dev:80/da/brugte-biler/F...   19.2 +0.0   3 sql   0.5
  Executing action: search                         83.4 +16.0  48 sql  9.4
   Rendering: cars_search/table_listing            819.2  +99.0  356 sql   71.2
    Rendering: cars/_reliability_report            12.5 +601.0
    Rendering: cars_search/_sidebar                1093.7 +616.0   281 sql   356.7
    Rendering: cars/_listing_table                 1612.6 +1731.0  123 sql   549.5
    Rendering: kaminari/_paginator                 27.2 +3632.0
   Rendering: layouts/search_results               31.3 +3671.0
    Rendering: layouts/_shared_head_content        223.4  +3673.0
    Rendering: partials/_top_links                 2.6  +3907.0
    Rendering: partials/_search_form               165.1  +3912.0
    Rendering: partials/_footer_links              5.2  +4086.0
    Rendering: layouts/_shared_footer_content      8.7  +4099.0
share show trivial show time with children   24.0 % in sql

ここで奇妙なのは、つまり、356 の sql ステートメントが呼び出されているということです。しかし、当然のことながらありません。それらをクリックして、何が呼び出されたかを確認すると、次のような多くのステートメントが表示されます。

8.70 ms 
Executing action: search — 7.70 ms
Executing action: search
T+23.7 ms
Reader
0.3 ms
app/models/car_search.rb:97:in `relation'
app/controllers/cars_search_controller.rb:102:in `pagination_relation'
app/controllers/cars_search_controller.rb:37:in `search'
app/controllers/controller_concerns/country_requesting.rb:66:in `select_database_shard'
lib/www_middleware.rb:11:in `call'
SELECT 1   
Executing action: search
T+25.8 ms
Reader
0.2 ms
app/models/car_search.rb:97:in `relation'
app/controllers/cars_search_controller.rb:102:in `pagination_relation'
app/controllers/cars_search_controller.rb:37:in `search'
app/controllers/controller_concerns/country_requesting.rb:66:in `select_database_shard'
lib/www_middleware.rb:11:in `call'
SELECT 1   
Executing action: search
T+26.8 ms
Reader
0.2 ms
app/models/car_search.rb:97:in `relation'
app/controllers/cars_search_controller.rb:102:in `pagination_relation'
app/controllers/cars_search_controller.rb:37:in `search'
app/controllers/controller_concerns/country_requesting.rb:66:in `select_database_shard'
lib/www_middleware.rb:11:in `call'
SELECT 1

そしてそれは356回も続く。

私はこれをどうするか非常に困惑しています。これが何であるかの手がかりはありますか?

アップデート:

car_search.rb のコードは、関連するクエリを構築するかなり重いメソッドです。基本的に、これが行うことは次のようなものです。

def relation
  cars = Car.onsale # a scope that says .where(:sales_state => 'onsale')

  cars = cars.with_brand(brand) if brand.present? # a scope that says .where(:brand => 'some_brand')

  cars = cars.with_model_name(model_name) if model_name.present? # a scope that says .where(:model_name => 'some_model_name')

  return cars
end
4

0 に答える 0