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