postgres中的子查询或联合联合?

时间:2018-01-07 12:03:07

标签: sql postgresql subquery inner-join outer-join

我有所谓的链接,可以为它们分配标签,所以我将它存储在3个表中:

  • tag:id,name
  • tag_in_link:tag_id,link_id
  • link:id,url

现在我需要获得基本标签计数:标签使用次数(包括0次)。我有两个问题:

select t.id, t.name, count(*)
from tag as t inner join tag_in_link as tl
    on tl.tag_id = t.id
group by t.id, t.name
union
select t.id, t.name, 0
from tag as t left outer join tag_in_link as tl
    on tl.tag_id = t.id where tl.tag_id is null

union of joins explained

select t.id, t.name,
       (select count(*) from tag_in_link as tl
              where tl.tag_id = t.id
       ) as count from tag as t

correlated subquery

他们都给出相同的(达到记录顺序)结果并且工作几乎一样快

问题是我没有太多数据来测试它,但我今天需要采取这样或那样的方式。我所知道的就是:

  • 最多100个标签
  • 数百万条链接

所以我的问题:

  • 哪种方法:依赖子查询或联接联合在postgres中的大表上有更好的性能?

2 个答案:

答案 0 :(得分:1)

对于大型数据集,第一个查询会更好,因为它不会强制嵌套循环。

但为什么不使用最佳查询:

self

答案 1 :(得分:0)

考虑将UNION与条件聚合相结合,仍然避免每行的相关子查询运行。

select t.id, t.name, 
       sum(case when tl.tag_id is null then 0 else 1 end) as tag_count
from tag as t 
left join tag_in_link as tl
    on tl.tag_id = t.id
group by t.id, t.name