[目的]
我们想查看表A中是否已存在某个事件,如果已存在多少次。然后,这个count()应该连接在一个查询中,该查询包括所有表B事件和表A出现次数。
[背景]
'表A'有大约400万行,结构如下:
| unique_id | date |
'表B'有大约100万行具有以下结构:| unique_id | date | cost |
'unique_id'是我们可以用来做“连接”的系统范围的id
[预期结果]
输出如下:
b.unique_id | b.date | 'count of A events, if any' | b.cost
[问题]
- 如何构建此查询,因为它尽可能快地运行?一个看法?一个问题?还有别的吗?
谢谢!
答案 0 :(得分:1)
您似乎想要的查询是:
select b.uniqueid, count(a.uniqueid) as num_a, b.cost
from b left join
a
on b.uniqueid = a.uniqueid
group by b.uniqueid, b.cost;
优化查询在很大程度上取决于数据库。对于此查询,a(uniqueid)
上的索引肯定会有所帮助。可能是b(uniqueid, b.cost)
上的一个。
在某些情况下,将此类查询编写为:
可能会更快select b.uniqueid,
(select count(*) from a where b.uniqueid = a.uniqueid) as num_a,
b.cost
from b;
在这种情况下,实际上只需要a(uniqueid)
上的索引。
答案 1 :(得分:0)
如果这些表的连接是您的问题,也许您可以制作物化视图。 另外,你需要问自己,你真的需要这张桌子上的所有这些数据吗?也许你可以压缩这个表的一部分,使它们更轻。