1) 스칼라 서브쿼리를 이용한 조인
Select d.deptno, d.dname,
(select sum(sal) from emp where deptno = d.deptno) sum_sal,
(select max(sal) from emp where deptno = d.deptno) max_sal
From dept d
▶ 스칼라 서브쿼리로 동일 테이블 여러 번 읽을 경우 아래와 같이 변경 합니다
Select d.deptno, d.dname,
To_number(substr(sal,1,7)) sum_sal,
To_number(substr(sql, 8,7)) max_sal
From (
Select d.deptno, d.dname,
(select lpad(sum(sal),7)||lpad(max(sal),7) from emp where deptno = d.deptno) sal
★ 하나로 만드는게 핵심!!!(테이블을 한번만 읽는다)
From dept d
)
참고) 스칼라 서브쿼리는 결과 행 수 만큼 반복하므로 매우 비효율적이므로
복잡한 계산식이나 어쩔 수 없는 경우를 제외하고서는
가급적 join으로 풀어서 사용할 수 있게 합니다
(테이블 조인이 많다고 느려지는게 아니라는거!!! 아시죠?)
2) One-sql 사용
For ~ loop로 읽어서 update or insert할 때 -> merge문 사용으로 변경
For
Loop
If ~~
Insert or update
End loop
▶ merge문으로 변경
merge into target_table
using ( selelct ~
)
On ( 조건문 )
When matched then
Update
Set
When not matched then
Insert
Into
3) or 조건을 union all로 변환하기!
select *
from emp
where sql = 3000
or deptno = 200 ;
▶ 쿼리 변환
Select * from emp
Where sql = 3000
Union all
Select * from emp
Where deptno = 200
And lnnvl(sal = 3000) ;
4) 인덱스 변경 및 힌트 적용
5) 기타 사항
◆ 인덱스 사용이 불가능 한 경우
좌변 컬럼 가공
부정 연산자 사용 (not …)
null검색
묵시적 형변환