시소당
decode를 남용하면 성능을 저하시키기 때문에 group by와 in line view를 적절히 이용한다.
예제: qualifier 테이블의 직종별, 성별로 구분하여 등록월별(1/4분기)로 등록된 건수를 가로로 펼쳐서 나타내어라.
Select job_class, sex,
sum(decode(reg_wd,’199701’,1,0) as 9701월,
sum(decode(reg_wd,’199702’,1,0) as 9702월,
sum(decode(reg_wd,’199703’,1,0) as 9703월
from qualifier
group by job_class, sex;
<해결안>
Select /*+ full(qualifier) paraller(qualifier,2) */ job_class, sex,
sum(decode(reg_wd,’199701’,1,0) as 9701월,
sum(decode(reg_wd,’199702’,1,0) as 9702월,
sum(decode(reg_wd,’199703’,1,0) as 9703월
from qualifier
group by job_class, sex;
병렬조회에 의해서도 성능이 저하되는데 이는 매건 마다 sum함수와 decode를 사용하기 때문이다.
<개선안> 인라인뷰를 이용한다.
Select JC,SX,
sum(decode(R_W,’199701’,CNT,0) as 9701월,
sum(decode(R_W,’199702’,CNT,0) as 9702월,
sum(decode(R_W,’199703’,CNT,0) as 9703월
from (select /*+ full(qualifier) paraller(qualifier,2) */
job_class as JC, sex as SX, reg_wd as R_W, count(*) as CNT
from qulifier
group by job_class, sex, reg_wd)
group by JC, SX
 DECODE의 사용예제
고객테이블 : Customer에 대하여 정식 고객이 존재하면 E00, 존재하지 않으면E01을
리턴하고, 존재할 경우 서로 등급을 비교하여 값이 같으면 G00, 다르면 G01을
리턴한다.
 select a.custo_no, decode(b.custo_no, null, ‘E01’,’E00’),
decode(b.custo_grade,null,null,A.grade,’G00’,’G01’)
from customer_temp a, customer b
where a.custo_no = b.custo_no(+);
 영업점-고객-발송주소에 있어서 특정영업점에 해당하는 고객들의 최근 주소를 가져온다.
Select /+ index_desc(발송주소변경_pk) */ 적용일자
from 발송주소
where rownum=1