自分のアプリケーション (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