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.