이펙티브 오라클 (2009년)
단순화하라 0 0 65,202

by 구루비스터디 단순화하라 [2018.05.26]


  • 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차이
래치 합계20225546188525963


  • 이 결과를 통해 단순히 외부 조인을 사용하는 것이 간단한 함수를 작성하는 것보다 훨씬 쉽고, 빠르다는 것을 알 수 있다.
"구루비 데이터베이스 스터디모임" 에서 2009년에 "이펙티브 오라클" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3457

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입