728x90
# STAR JOIN
- 노란색 테이블은 아주 큰 대용량 테이블
- 파란색 테이블이 아주 작은 테이블
- 파란색 테이블끼리 연결고리가 없어서 연결고리 없이 조인 한다
- 파란색이 크기가 작은 테이블들인데 sales의 거대한 테이블과 hash나 nl 각각 조인을 하려면 시간을 많이 소비하게 된다
- 그렇기 때문에 크기가 작은 테이블들을 먼저 조인하고 맨 나중에 가장 큰 테이블인 sales 를 조인하면 속도를 높일 수 있다
# dept ---- emp ---- salgrade SELECT e.ename, d.loc, e.sal, s.grade FROM EMP e, DEPT d, SALGRADE s WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s. hisal; |
SELECT /*+ leading(d s) */ d.loc, s.grade, d.deptno FROM DEPT d, SALGRADE s; - cartesian : 연결고리 없이 조인을 수행했다 |
# dept --- salgrade --- emp - 가장 크기가 작은 테이블인 dept를 먼저 조인하고 크기가 큰 emp 테이블을 맨 나중에 조인한다 SELECT /*+ leading(d s e) */ e.ename, d.loc, e.sal, s.grade FROM EMP e, DEPT d, SALGRADE s WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s. hisal; - cartesian이 수행계획에 나오지만 결국 dept, salgrade 와 조인을 수행하고 emp와merge를 확인할 수 있다 - 원래 hash 조인일 떄는 dept, emp, salgrade 순서로 했을 때 최적이었지만 star join을 이용해서 순서를 바꿔주고 merge 조인을 해주면 속도가 향상되는 것을 확인할 수 있다 |
문제88. 아래의 SQL 조인 순서와 조인방법을 아래와 같이 하시오(조인순서 : p - t - s, 조인방법 : p,t - merge. t,s - hash)
# 튜닝 전 |
select /*+ leading(t s p) use_hash(s) use_hash(p) */ p.prod_name, t.CALENDAR_YEAR, sum(s.amount_sold) from sales100 s, times100 t, products100 p where s.time_id = t.time_id and s.prod_id = p.prod_id and t.CALENDAR_YEAR in (2000,2001) and p.prod_name like 'Deluxe%' group by p.prod_name, t.calendar_year; - 11초 수행 |
# 튜닝 후 |
select /*+ leading(p t s) use_merge(t) use_hash(s) */ p.prod_name, t.CALENDAR_YEAR, sum(s.amount_sold) from sales100 s, times100 t, products100 p where s.time_id = t.time_id and s.prod_id = p.prod_id and t.CALENDAR_YEAR in (2000,2001) and p.prod_name like 'Deluxe%' group by p.prod_name, t.calendar_year; - 7초 수행 |
'빅데이터과정 > SQL TUNING' 카테고리의 다른 글
#37_140805_TUNING_DYNAMIC SAMPLING (0) | 2014.08.05 |
---|---|
#37_140805_TUNING_MODEL 절 (0) | 2014.08.05 |
#36_140804_TUNING_UNION TUINING (0) | 2014.08.04 |
#35_140801_TUNING_JOIN TUNING2 (0) | 2014.08.01 |
#34_140731_TUNING_JOIN TUNING (0) | 2014.07.31 |