2017-07-08 46 views
0

(這個問題是爲了自學)。分組依據與加入哪一個需要更長的時間?

我有兩個表。

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

不確定,但我認爲這歸結於執行查詢在這裏。你不僅要做分組,還要做一個聯盟。我認爲集團還必須先完成查詢以比較結果。而加入的速度要快得多。爲什麼我不能詳細告訴你 –

回答

0

第一個查詢應該寫成。沒有索引就有一個「取決於」。你應該試試你的數據。但是一個合理的數據庫可能會爲連接執行散列連接,並且會比等效聚合更快。

此外,執行union all可能會阻止使用索引。由此產生的聚合算法將比使用索引的join慢。

+0

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

+0

@ user98235。 。 。 'coalesce()'簡單得多。 –