2015-06-18 52 views
2

[目的]
我们想看看了,如果一个事件在表上已经存在,如果是多少倍。然后这个count()应该被加入到包含所有表B事件和表A事件计数的单个查询中。连接/查询大表

[语境]
'表A' 具有约4个百万行用以下结构: | unique_id | date |
'表B' 具有约1个百万行用以下结构:| unique_id | date | cost |
'UNIQUE_ID' 是上系统广ID,我们可以用来做 “加入”

[预期结果]
有一个输出如下:

b.unique_id | b.date | 'count of A events, if any' | b.cost 

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

谢谢!

+0

你需要使用它的索引!!! ..它会帮助:) – Vidhi

+2

你还使用哪些DBMS? Postgres的?甲骨文?总的来说,调整的第一步是查看执行计划。 –

+0

这听起来像你正在尝试做几件不同的事情(确定一个记录是否存在,获得一个计数,获取相关记录......)。你能给出一个输出结果的例子吗? – John

回答

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)索引。

0

如果加入这张表是你的问题,也许你可以做一个物化视图。 其他的事情,你需要问自己,你真的需要这张表中的所有数据吗?也许你可以压缩这些表格的一部分,并使它们更加明亮。