2013-07-18 4 views
1

Я попытался использовать драгоценный камень под названием «пуля», чтобы избежать проблемы с N + 1.Почему не помогает ускорить работу?

Мой предыдущий код был

@communities = Community.scoped.page(params[:page]).order("created_at DESC") 

Тогда я получаю эту ошибку

N+1 Query detected 
    Community => [:platform] 
    Add to your finder: :include => [:platform] 

N+1 Query detected 
    Community => [:genre] 
    Add to your finder: :include => [:genre] 

N+1 Query detected 
    Community => [:tags] 
    Add to your finder: :include => [:tags] 

Затем она принимает около 650ms, чтобы показать страницу с более чем 80 SQL.
Так что я изменил его на этом

@communities = Community.scoped.page(params[:page]).order("created_at DESC").includes(:platform, :genre, :tags) 

Теперь, ушла тревога пули, но он принимает 750ms и есть еще более 80 SQL.

Почему?

ответ

0

Во-первых, ваш код страницы неправильный. Оно должно быть таким:

@communities = Community.scoped.order("created_at DESC").paginate(per_page: 10, page: params[:page]) 

Во-вторых, это трудно сказать, потому что вы не упоминаете, если это 750 мс общее время выполнения или только запросы.

По прихоти, я подозреваю, это потому, что вы загружаете много записей в память. Это может быть связано с тем, сколько записей записано в ваших таблицах, и указали ли вы их индексирование.

Предлагаю вам воспользоваться инструментом, например Miniprofiler, чтобы профанировать вашу страницу. Это поможет вам точно узнать, где ваши задержки.

Другие вещи, которые вы можете сделать, если предположить, что это база данных, а не что-то другое:

  1. Добавить пагинацию ограничить набор результатов.
  2. Взгляните на свои журналы; у них много полезной информации.
  3. Таблицы индексируются? Если не добавить индексы.
  4. Использовать мини-фильтр.
+0

Я запускаю его в режиме производства. Также выполняется прекомпиляция активов. Как добавить разбивку на страницы, чтобы ограничить набор результатов? Я думал, что все в порядке, пока у меня есть 'page (params [: page])' – MKK

+0

Нет, 'params [: page]' не поможет, если вы не вызываете его по методу запроса. Как еще Rails знает, какую страницу вы хотите? – Mohamad

+0

вы можете здесь проверить? http://stackoverflow.com/questions/17712893/how-can-i-code-if-i-want-to-avoid-n-plus-one-issue Студент имеет 3 столбца. Он выдавал 3 sql (для извлечения Gender, BloodType и префектуры) для каждого ученика. Поэтому, когда было показано 10 учеников, было выпущено 30 запросов. После того, как я добавил 'includes', он все тот же. Зачем? Я проверяю драгоценный камень под названием «bullet» и «rack-mini-profiler» – MKK

Смежные вопросы