by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

단순화하라




  • KISS(Keep In Simple, Silly) 원칙을 중히 여기며 저항이 가장 적은 코스,
    즉 오류 없이 목표를 달성하기 위한 가장 쉬운 행동 코스를 선호한다.

12.1 대안을 고려하라

  • 테이블을 삭제한 후 다시 생성하지 않고 기존 열 사이에 테이블 열을 추가하는 방법
    (1)기존 테이블 rename 후 뷰를 활용하는 방법
    (2)임시 컬럼을 활용하는 방법
    ->(2)번 방법은 테이블을 반복적으로 다시쓰기 때문에 업데이터에 따른 행의 이동이 잦고, 성능이 저하될 수 있다.

12.2 데이터베이스가 최선을 다하도록 내버려두자

  • 7~8개의 작은 테이블이 대용량 CUSTOMERS 테이블의 COUNTRY, STATE, CITY 열을 참조하는 사례
    (1)몇 번의 외부 조인 후에 매개변수에 나타난 언어로 걸러낸다.
    select t.*
          ,t2.c1
          ,t3.c2
      from t
          ,t2
          ,t3
     where t.key1 = t2.key1(+)
       and t.key2 = t3.key2(+);
    또는
    select t.*
          ,( select c1 
               from t2
              where t2.key1 = t.key1 ) c1
          ,( select c2
               from t3
              where t3.key2 = t.key2 ) c2
      from t;
    

    (2)함수 기반의 열: fn_county(costomer.id_country, p_inlang)
    (3)CUSTOMER 열만 포함된 커서를 열고, 준비되고 걸러진 고객 데이터로부터 가져온 데이터에 fn_country를 적용한다.

  • 실습
    (1)테이블, 인덱스, 통계정보 생성
    create table t1 as select * from all_objects;
    create table t2 as select * from all_objects where rownum <= 15000;
    
    alter table t1 add constraint t1_pk primary key(object_id);
    alter table t2 add constraint t2_pk primary key(object_id);
    
    analyze table t1 compute statistics
      for table for all indexes for all indexed columns;
    
    analyze table t2 compute statistics
      for table for all indexes for all indexed columns;
    


    (2)3번째 방법과 같은 함수 작성

    create or replace function get_data( p_object_id in number ) return varchar2
    is
       l_object_name t2.object_name%type;
    begin
       select object_name into l_object_name
         from t2
        where object_id = p_object_id;
       return l_object_name;
    exception
       when no_data_found then
          return NULL;
    end;
    /
    


    (3)Runstats를 사용하여 두가지 방법의 성능 비교

    set serveroutput on size 1000000;
    begin
       runstats_pkg.rs_start;
       for x in ( select a.object_id
                        ,a.object_name oname1
                        ,b.object_name oname2
                 from t1 a
                     ,t2 b
                where a.object_id = b.object_id(+) )
       loop
          null;
       end loop;
       runstats_pkg.rs_middle;
       for x in ( select object_id
                        ,object_name oname1
                        ,get_data(object_id) oname2
                    from t1 )
       loop
          null;
       end loop;
       runstats_pkg.rs_stop;
    end;
    /
    




    이 방법은 시간상으로 4% 이내에서 실행되었다! 데이터베이스에게 알아서 하라고 내버려두었는데도 말이다.
    래치 부문에서도 데이터베이스에게 맡겨둔 방법이 훨씬 적은 래치를 사용하였다.

      방법1 방법2 차이
    래치 합계 20225 546188 525963

    이 결과를 통해 단순히 외부 조인을 사용하는 것이 간단한 함수를 작성하는 것보다 훨씬 쉽고, 빠르다는 것을 알 수 있다.

문서에 대하여

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.