提高大型联接的查询性能

时间:2016-02-17 20:04:38

标签: sql postgresql

我正在尝试获取在使用指定语言的任何回购邮件上执行拉取请求的用户列表。

SELECT distinct(actor_id) as id FROM pull_requests 
JOIN (SELECT id FROM repos WHERE language = 'javascript') as res 
  ON pull_requests.repo_id = res.id

我一直在尝试提高此查询的性能。目前运行需要2秒+。

3 个答案:

答案 0 :(得分:1)

首先 - 尝试半连接:

SELECT distinct actor_id as id
FROM pull_requests p
where exists (
  select null
  from repos r
  where p.repo_id = r.id and r.language = 'javascript'
)

其次 - 根据此更改验证您的distinct是否必要。在这种情况下,可能是,但是半连接通常可以消除distinct的需要,其中它被用作1 ::多次返回多行的拐杖 - exists不会根据repos表中的多个匹配项对结果进行乘法。

答案 1 :(得分:0)

试试这个:

{{1}}

您可能需要在repo_id和/或id字段

上建立索引

答案 2 :(得分:0)

尝试使用IN

SELECT distinct(actor_id) as id 
FROM pull_requests 
WHERE pull_requests.repo_id IN (SELECT id FROM repos WHERE language = 'javascript')