Медленный поиск с включением нескольких ассоциаций - PullRequest
1 голос
/ 20 мая 2011

В действии контроллера Rails я вызываю

@grid = Grid.find(params[:id], :include => [:grid_properties, :grid_entities => [:entity => :properties]])

К сожалению, это занимает очень много времени. Benchmark.realtime (в режиме разработки) сообщает мне 1.8812830448150635, так что около 2 секунд (Rails 3.0.7, Postgres 8.4).

При включении ведения журнала SQL я получаю следующее для этой строки кода:

Grid Load (0.9ms)  SELECT "grids".* FROM "grids" WHERE "grids"."id" = 2 LIMIT 1
GridProperty Load (2.5ms)  SELECT "grid_properties".* FROM "grid_properties" WHERE ("grid_properties".grid_id = 2) ORDER BY row_order
GridEntity Load (1.3ms)  SELECT "grid_entities".* FROM "grid_entities" WHERE ("grid_entities".grid_id = 2) ORDER BY row_order
Entity Load (3.0ms)  SELECT "entities".* FROM "entities" WHERE ("entities"."id" IN (28,7,3,6,25,11,2,12))
Property Load (6.4ms)  SELECT "properties".* FROM "properties" WHERE ("properties".entity_id IN (28,7,3,6,25,11,2,12))

Кажется, что каждый доступ к базе данных находится в диапазоне низких миллисекунд. Почему это так долго в итоге?

1 Ответ

1 голос
/ 20 мая 2011

Полагаю, что на создание объекта Ruby уходит время.Сколько свойств в этой сетке?Время 'ВЫБРАТЬ ИЗ свойств' выглядит относительно высоким.

Вы могли бы продолжить изучение проблемы, если у вас есть некоторые функции, в которых вы могли бы разместить контрольные точки - logger.debug "CHECKPOINT: #{Time.now} #{caller(0).first}"

Есть ли у вас какие-либо 'on_load 'обратные вызовы, может быть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...