2017-10-05 19 views
1

select文を通して複数回繰り返される複雑なサブクエリがある場合、Hiveでクエリを構造化/書き込む最良の方法は何ですか?ハイブ - 最適なパフォーマンスでハイブ内のサブクエリを再利用する方法

私はもともと、各実行前にリフレッシュされたサブクエリ用の一時テーブルを作成しました。次に、元のクエリの一部としてCTEを使用して(一時表を破棄して)、可読性とパフォーマンスの低下に気付きました。これにより、サブクエリを再利用する必要がある場合に、パフォーマンスに関してどの実装方法が最も良いかがわかりました。

私が扱っているデータには、1,000万件以上のレコードが含まれています。以下は、CTEを使用して作成したクエリの例です。

with temp as (
    select 
     a.id, 
     x.type, 
     y.response 
    from sandbox.tbl_form a 
    left outer join sandbox.tbl_formStatus b 
    on a.id = b.id 
    left outer join sandbox.tbl_formResponse y 
    on b.id = y.id 
    left outer join sandbox.tbl_formType x 
    on y.id = x.typeId 
    where b.status = 'Completed' 
) 
select 
    a.id, 
    q.response as user, 
    r.response as system, 
    s.response as agent, 
    t.response as owner 
from sandbox.tbl_form a 
left outer join (
    select * from temp x 
    where x.type= 'User' 
) q 
on a.id = q.id 
left outer join (
    select * from temp x 
    where x.type= 'System' 
) r 
on a.id = r.id 
left outer join (
    select * from temp x 
    where x.type= 'Agent' 
) s 
on a.id = s.id 
left outer join (
    select * from temp x 
    where x.type= 'Owner' 
) t 
on a.id = t.id; 

答えて

1

クエリに問題があります。

1)CTEには、ON句がない3つの左結合があります。これは、ON句のない結合がCROSS JOINSであるため、重大なパフォーマンスの問題を引き起こす可能性があります。

2)BTW where b.status = 'Completed'節は、テーブルbのLEFT結合を内部結合に変換しますが、まだON句を使用しないと、aからのすべてのレコードをbからaのすべてのレコードと乗算します。

3)ほとんどの場合、CTEはまったく必要ありません。 ON節に正しく参加し、min()またはmax()を使ってcase when type='User' then response end +集計を使用してください。id