Оптимизировать запрос PostgreSql-8.4 - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть код контроллера рельсов, как показано ниже:

@checked_contact_ids = @list.contacts.all(
  :conditions => {
    "contacts_lists.contact_id" => @list.contacts.map(&:id),
    "contacts_lists.is_checked" => true
  }
).map(&:id)

эквивалентно sql

SELECT *
FROM "contacts"
INNER JOIN "contacts_lists" ON "contacts".id = "contacts_lists".contact_id
WHERE ("contacts_lists".list_id = 67494 ) 

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

Кто-нибудь знает, пожалуйста, заметьте меня Или это возможно? или этого запроса достаточно для выдачи результата?

Я жду информацию ...................

1 Ответ

1 голос
/ 20 апреля 2011

Я думаю, что основная проблема с вашим исходным AR-запросом заключается в том, что он вообще не выполняет никаких соединений; вы вытаскиваете кучу объектов из базы данных через @list.contacts, а затем отбрасываете большую часть этой работы, чтобы получить только идентификаторы.

Первым шагом будет замена "contacts_lists.contact_id" => @list.contacts.map(&:id) на :joins => 'contact_lists', но вы все равно будете вытаскивать кучу вещей из базы данных, создавать экземпляры группы объектов, а затем выбрасывать все это с помощью .map(&:id), чтобы получить только идентификационные номера.

Вы уже знаете SQL, поэтому я, вероятно, сразу перейду к SQL с помощью удобного метода в вашей модели List (или каков @list), что-то вроде этого:

def checked_contact_ids
    connection.execute(%Q{
        SELECT contacts.id
        FROM contacts
        INNER JOIN contacts_lists ON contacts.id = contacts_lists.contact_id
        WHERE contacts_lists.list_id    = #{self.id}
          AND contacts_lists.is_checked = 't'
    }).map { |r| r['id'] }
end

А потом, в вашем контроллере:

@checked_contact_ids = @list.checked_contact_ids

Если этого недостаточно, проверьте ваши индексы в таблице contacts_lists.

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

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