SSISO Community

시소당

3. DECODE와 GROUP BY의 효율적인 사용

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
  

&#61482;  DECODE의  사용예제
        고객테이블  :  Customer에  대하여  정식  고객이  존재하면  E00,  존재하지  않으면E01을    
        리턴하고,  존재할  경우  서로  등급을  비교하여  값이  같으면  G00,  다르면  G01을  
        리턴한다.
&#61664;  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(+);

&#61482;  영업점-고객-발송주소에  있어서  특정영업점에  해당하는  고객들의  최근  주소를  가져온다.
        Select  /+  index_desc(발송주소변경_pk)  */  적용일자  
          from  발송주소  
          where  rownum=1

1682 view

4.0 stars