2017-10-05 9 views
1

select 문에서 여러 번 반복되는 복잡한 하위 쿼리가있을 때 하이브에서 쿼리를 작성/작성하는 가장 좋은 방법은 무엇입니까?하이브 - 최적의 성능으로 하이브의 하위 쿼리를 다시 사용하는 방법

나는 원래 실행될 때마다 새로 고쳐진 하위 쿼리에 대한 임시 테이블을 만들었습니다. 그런 다음 원래 쿼리 (임시 테이블 삭제)의 일부로 CTE를 사용하여 가독성을 높이고 성능 저하를 눈여겨 보았습니다. 이로 인해 하위 쿼리를 다시 사용해야 할 때 성능 측면에서 어떤 구현 방법이 가장 적합한 지 궁금합니다.

내가 작업중인 데이터에는 1 천만 개가 넘는 레코드가 포함되어 있습니다. 다음은 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 절을 사용하지 않으면 b의 모든 레코드를 a와 곱합니다.

3) 대부분 CTE가 필요하지 않습니다. ON 절에 올바르게 가입하고 min() 또는 max()을 사용하여

을 사용하여 case when type='User' then response end + 집계를 사용하세요.