2017-07-08 7 views
0

(この質問は自習用です)。これは時間がかかりますか?

私は2つのテーブルを持っています。

A - 次の列を含むテーブル:ユーザ、お金

B - 次の列を含むテーブル:ユーザ、数

お金は、ユーザが 数を過ごしたドル量が数でありますユーザーが購入したアイテムの数

AはBより少し大きいですが、AにはAが持つ一部のユーザーが見つからないが、Aは1.1〜1.2のようにBよりはるかに大きくありませんBの倍の倍数

私は、次の3つの列を含むテーブルを作成したいと考えています:user、money、number

ユーザーがテーブルBに存在しない場合は、数字として0を使用します。

2つの方法があります。

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のサイズに基づいて計算する良い方法はありますか?

+0

わかりませんが、ここではクエリの実行に至ると思います。あなたはグループバイをしているだけでなく、ユニオンをしています。 Group By私は、結果を比較するために最初にクエリを終了しなければならないと思います。一方で、これははるかに高速です。なぜ私は詳細を教えてくれなかったのですか –

答えて

0

最初のクエリは、のように記述する必要があります。これはあなたがやりたいための最速の方法でなければなりません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; 

。インデックスがなければ、それは「それに依存する」。あなたはあなたのデータを試してみるべきです。しかし合理的なデータベースは、おそらく結合のハッシュ結合を行い、同等の集約よりも速いでしょう。

さらに、union allを実行すると、おそらくインデックスの使用が排除されます。結果の集約アルゴリズムは、インデックスを使用するjoinよりも遅くなります。

+0

私のクエリはうまく動作するか、より速く動作する何らかの方法で合体していますか? – user98235

+0

@ user98235 。 。 'coalesce()'は単純に簡潔です。 –

関連する問題