优化查询PostgreSql-8.4

| 我有如下所示的Rails控制器代码:
@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 ) 
上面的查询需要更多的时间来运行,我想以另一种方式以最少的时间运行相同的查询。 有谁知道请注意我还是有可能吗?还是上面的查询足以提供输出? 我正在等待信息...................
已邀请:
我认为您最初的AR查询的主要问题在于,它根本不执行任何连接。您可以通过
@list.contacts
从数据库中拉出一堆对象,然后将大部分工作扔掉以获取ID。 第一步是将
\"contacts_lists.contact_id\" => @list.contacts.map(&:id)
替换为
:joins => \'contact_lists\'
,但是您仍然会从数据库中取出一堆东西,实例化一堆对象,然后将其与
.map(&:id)
扔掉,只得到ID号。 您已经知道SQL,所以我很可能会通过List模型(或任何
@list
)上的便捷方法直接使用SQL,如下所示:
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隔离在模型内部,就不会有任何问题。

要回复问题请先登录注册