SSISO Community

시소당

조인순서의 조정으로 소트회피

조인이  풀리는  테이블의  순서를  조정함으로서  소트된  결과를  구할  수  있다.
인덱스가  이미  소트되어  있다.    Order  by문의  컬럼순서  대로  인덱스를  만든다.  또한  From절의  먼순서부터  풀리므로  테이블의  순서를  조정하여  먼저  풀려야할  테이블을  조정한다.

  데이터복제를  이용한  Summery정보  계산

어떤  지점의  수신,  여신,  신탁총액을  구한다.

Select  b.br_no,  b.br_name,  sum(a.r_amt),  sum(a.a_amt),  sum(a.i_amt)
From  daily_trans  a,  branch  b
Where  a.br_no  =  b.br_no  and  a.saledate  =  :saledate
Group  by  b.br_no,  b.br_name

이  sql은  조인을  먼저한  후  그  결과를  Group  by하므로  횟수가  a.br_no  =  b.br_no건  수  만큼이나  된다.  그러나  Group  by를  먼저하고  그  결과를  조인하면  성능이  향상된다.

Select  b.br_no,  b.br_name,  ramt,  aamt,  iamt
From  (select  br_no,
                    Sum(r_amt)  as  ramt,
                    Sum(a_amt)  as  aamt,
                    Sum(I_amt)  as  iamt,
                    From  daily_tans  
                    where  saledate  =  :saledate
                  Group  by  br_no)  v,  branch  b
Where  v.br_no  =  b.br_no;

전체총계와  함께  나오는  sql
Select  b.br_no,  b.br_name,  ramt,  aamt,  iamt
From  (select  br_no,
            Sum(r_amt)  as  ramt,
            Sum(a_amt)  as  aamt,
            Sum(I_amt)  as  iamt,
            From  daily_tans  
            where  saledate  =  :saledate
            Group  by  br_no
            Union  all
            Select  ‘total’  as  br_no,  sum(r_amt)  as  ramt,
            Sum(a_amt)  as  aamt,
            Sum(I_amt)  as  iamt,
            From  daily_tans  where  saledate  =  :saledate
            where  saledate  =  :saledate)  v,  
branch  b
where  v.br_no  =  b.br_no(+);

-  tip
모델링시  슈퍼-서브타입의  경우  분리를  할  경우는  양쪽모두를  체크해야  하는데  이는  or,  union,  union  all등을  써야  하기  때문에  성능을  저하시킨다.

  반정규화

코드테이블이  분리되어  있어서  조인이  이루어  지는데  예를들어  지역별  날짜별  어떤  합계를  구하려한다면  없는  국가코드를  조인해야  함으로(outer  join)부담이  된다.  이를  해결하기  위해서  코드  테이블을  분리하고  이에대한  코드,  코드이름을  관련된  테이블에  중복시키다.

  

798 view

4.0 stars