Group By vs. Join哪一个需要更长的时间?

时间:2017-07-08 01:21:01

标签: sql time-complexity

(这个问题是为了自学)。

我有两张桌子。

A - 包含以下列的表:user,money

B - 包含以下列的表:user,number

money是用户花费的美元金额 number是用户购买的商品数量

A略大于B,A包含B包含的所有用户,而B缺少A所拥有的一些用户,但A也不比B大很多,比如B的大小的1.1~1.2倍。 / p>

我想创建包含以下3列的表:user,money,number

如果用户不在表B中,那么我们只使用0作为数字。

有两种方法可以做到这一点。

Select A.user, A.money, case when B.number is null then 0 else B.number end 
as number from A left join B on A.user=B.user


Select user, max(money), max(number) from
((Select user, money, 0 as number from A) 
union all (Select user, 0 as money, number from B)) 
group by user

我只是想知道如何确定哪个查询会占用更少的时间和内存。有没有一种很好的方法可以根据表A或B的大小来计算它?

1 个答案:

答案 0 :(得分:0)

第一个查询应写为:

Select A.user, A.money,
       coalesce(B.number, 0) as number
from A left join
     B
     on A.user = B.user;

使用B(user)B(user, number)上的索引,这应该是您想要的最快方式。没有索引就有“依赖”。你应该试试你的数据。但是合理的数据库可能会为连接执行散列连接,并且比等效的聚合更快。

此外,执行union all可能会排除使用索引。生成的聚合算法将比使用索引的join慢。