728x90
# UPDATABLE JOIN VIEW
l updatable join view
- 아래의 update 문장은 90만건 이상을 가진 테이블을 update 하는문장인데 이런 경우에 메인쿼리를 읽고 서브쿼리를 읽어들이기 때문에 date_id의 rn이 맞는 row를 하나하나 찾아서 90만* 90만 = 1800만 건의 update를 수행한다
- 이럴 경우 updatable join view가 필요하다
- 이 조인방법은 다른 조인방법에 비해서 속도가 빠르다
update sales200 s set date_id = ( select date_id from time2 t where t.rn = s.rn ); |
l updatable join 예
- 위 쿼리를 보면 emp_loc 컬럼은 비어있는 컬럼이고 dept_loc는 각각의 사원이름에 대한 위치가 출력된다
- 보여주고 하는 것은 비어있는 emp_loc 컬럼에 dept_loc의 데이터를 위처럼 그대로 입력하는 것이다
- 이전 그림에서 수행했던 select 문을 update문에 써주고 set 문장에 원하는 컬럼(emp_loc) 입력하도록 수행하면 빠르게 수행할 수 있따
- 위에서 예로 들었던 쿼리로 sales 테이블로 수행한다면 6시간 이상걸리게 된지만updatable join view를 이용하면 1분 내외로 수행할 수 있따
문제105. 아래의 SQL을 재작성 하시오(조인을 안하고도 똑 같은 결과가 나오도록 하시오)
n 수행을 위한 테이블
drop table sales200 purge; drop table sales100 purge; create table sales200 as select rownum rn, prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold from sh.sales; alter table sales200 add date_id date; drop table time2 purge; create table time2 ( rn number(10), date_id date ); begin for i in 1 .. 918843 loop insert into time2 values( i , to_date('1961/01/02','YYYY/MM/DD')+ i ); end loop; end; / commit; alter table time2 add constraint times200_time_id_pk primary key(rn); alter table sales200 add constraint sales200_time_id_fk foreign key(rn) references time2(rn); |
# 튜닝 전 |
update sales200 s set date_id = ( select date_id from time2 t where t.rn = s.rn ); - 설명 : 메인쿼리의 테이블의 건수만큼 update 문이 반복 되고 있기 떄문에 속도가 굉장히 느리다 - 메인쿼리 테이블의 컬럼이 서브쿼리 안으로 들어가게 되면 메인쿼리부터 수행이 된다 - s.rn 에 1 ~ 918443 번까지 수행을 한다 |
# 튜닝 후 |
# merge 문 MERGE INTO SALES200 s USING time2 t ON (t.rn = s.rn) WHEN matched THEN UPDATE SET s.date_id = t.date_id; - 수행시간 : 60초 # updatable join view UPDATE (SELECT s.rn, s.date_id AS sales_id, t.date_id AS time2_id FROM SALES200 s, time2 t WHERE s.rn = t.rn) SET sales_id = time2_id; - 수행시간 : 45초 - 튜닝을 하기전에는 6시간이상 걸리던 쿼리를 updatable join을 이용해서 45초로 단축시킬 수 있다 |
'빅데이터과정 > OWI' 카테고리의 다른 글
#40_140807_OWI_LATCH (0) | 2014.08.07 |
---|---|
#40_140807_OWI_WAIT EVENT (0) | 2014.08.07 |
#40_140807_OWI_SHARED POOL에서 LATCH 경합 (0) | 2014.08.07 |
#39_140806_OWI_LATCH (0) | 2014.08.06 |
#39_140806_OWI_WAIT EVENT (0) | 2014.08.06 |