分组依据与加入哪一个需要更长的时间?

问题描述:

(这个问题是为了自学)。分组依据与加入哪一个需要更长的时间?

我有两个表。

A - 含有以下的表:用户,钱

乙 - 包含下列的表:用户,数

钱用户花费 数金额是多少用户购买的商品

A比B略大,A包含B包含的所有用户,而B缺少A的某些用户,但A也不比B大得多,如1.1〜1.2倍于B的尺寸。

我想创建包含以下3列的表格:用户,金钱,号码

如果用户不在表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的大小来计算它?在B(user)B(user, number)这应该是你想要做什么的最快方法

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

随着指数:

+0

不确定,但我认为这归结于执行查询在这里。你不仅要做分组,还要做一个联盟。我认为集团还必须先完成查询以比较结果。而加入的速度要快得多。为什么我不能详细告诉你 –

第一个查询应该写成。没有索引就有一个“取决于”。你应该试试你的数据。但是一个合理的数据库可能会为连接执行散列连接,并且会比等效聚合更快。

此外,执行union all可能会阻止使用索引。由此产生的聚合算法将比使用索引的join慢。

+0

我的查询工作正常,或者是合并方法的工作更快? – user98235

+0

@ user98235。 。 。 'coalesce()'简单得多。 –