我有所谓的链接,可以为它们分配标签,所以我将它存储在 3 个表中:
- 标签:id,姓名
- tag_in_link: tag_id, link_id
- 链接: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
和
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
它们都给出相同的(达到记录的顺序)结果并且工作速度几乎一样快
问题是我没有太多数据来测试它,但我今天需要选择一种或另一种方式。我所知道的是,将会有:
- 最多 100 个标签
- 数百万个链接
所以我的问题是:
- 哪种方法:依赖子查询或联合联合在 postgres 中的大型表上具有更好的性能?
最佳答案
第一个查询对于大型数据集会更好,因为它不会强制嵌套循环。
但为什么不使用最优查询:
SELECT t.id, t.name, count(*)
FROM tag AS t LEFT JOIN tag_in_link AS tl
ON tl.tag_id = t.id
GROUP BY t.id, t.name;
关于sql - postgres 中的子查询或连接联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48136891/