加入/查询大表

时间:2015-06-18 10:25:11

标签: sql

[目的]
我们想查看表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

[问题]
- 如何构建此查询,因为它尽可能快地运行?一个看法?一个问题?还有别的吗?

谢谢!

2 个答案:

答案 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)

如果这些表的连接是您的问题,也许您可​​以制作物化视图。 另外,你需要问自己,你真的需要这张桌子上的所有这些数据吗?也许你可以压缩这个表的一部分,使它们更轻。