Как улучшить производительность этих запросов? - PullRequest
1 голос
/ 19 марта 2011

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

У меня были проблемы с тем, чтобы эта страница работала хорошо - два дня назад время локальной загрузки составляло 4,5 с (!), И в настоящее время оно составляет ~ 2,5 с (!). Самым тревожным моментом в этой ужасной производительности является то, что это время загрузки только с 3 проектами и практически без событий. Производительность в живом приложении немного лучше, но этого недостаточно.

Цель: улучшить время загрузки на домашней странице

Вот текущие запросы.

# controller
@projects = @company.projects.order("project_title ASC").includes({:events => :owner}).search(params[:search], params[:page])

# view
@projects.each do |project|
  @events = project.events.where(:active => true).includes(:owner).order("priority DESC")
end

Удаление .where(:active => true).includes(:owner).order("priority DESC") сокращает 1,1 секунды в приложении всего с 3 проектами и 4 событиями.

Как эти запросы должны быть написаны оптимально? Должна ли индексирование играть роль в этом случае?

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

1 Ответ

3 голосов
/ 19 марта 2011

Ваши .includes (: events =>: owners) не выполняют то, что вы думаете, как при вызове .where для событий позже, вам придется снова извлечь из базы данных.

Кроме того, если вашМетод поиска использует таблицу событий и владельцев, которую вы можете использовать .joins () вместо .include ().

Я бы позаботился о том, чтобы у вас были индексы для каждого внешнего ключа (xxx_id) и для активных событий.

Я бы тоже попробовал (не уверен, что это сработает, возможно, потребуется подправить):

class Project < AR::Base
  has_many :events
  has_many :active_events,
    :class_name => 'Event',
    :conditions => {:active => true},
    :order => "events.priority DESC"
    :include => :owner
end

#in controller:
@projects = @company.projects.order("project_title ASC").includes(:active_events).search(...)


#in view: (abstract this to a render collection method if possible)
@project.each do |project|
  @events = project.active_events
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...