정규화 성능 테스트
--테스트 테이블 생성
create table testtb1
(
acol varchar2(10),
bcol varchar2(10),
ccol varchar2(4000)
)
create table testtb2
(
acol varchar2(10),
bcol varchar2(10)
)
create table testtb3
(
acol varchar2(10),
ccol varchar2(4000)
)
-------------------------------------------------------
--case 1 : 사이즈가 큰 컬럼에 간혹 데이터가 존재할 때--
-------------------------------------------------------
--테스트 데이터 삽입
insert into testtb1
select DBMS_RANDOM.STRING('X', 10) acol
, DBMS_RANDOM.STRING('X', 10) bcol
, case when mod(rownum,100) = 0 then DBMS_RANDOM.STRING('X', 4000) end ccol
from dual
connect by level <= 50000
insert into testtb2
select acol, bcol
from testtb1
insert into testtb3
select acol, ccol
from testtb1
where ccol is not null
--테스트 테이블 analyze
analyze table testtb1 compute statistics
analyze table testtb2 compute statistics
analyze table testtb3 compute statistics
--테스트 테이블 block 수 측정
select blocks from all_tables where table_name = 'testtb1'
--> 2727
select blocks from all_tables where table_name = 'testtb2'
--> 187
select blocks from all_tables where table_name = 'testtb3'
--> 503
---------------------------------------------------------
--case 1 : 사이즈가 큰 컬럼에 대부분 데이터가 존재할 때--
---------------------------------------------------------
--테이블 truncate
truncate table testtb1
truncate table testtb2
truncate table testtb3
--테스트 데이터 삽입
insert into testtb1
select DBMS_RANDOM.STRING('X', 10) acol
, DBMS_RANDOM.STRING('X', 10) bcol
, (select DBMS_RANDOM.STRING('X', 4000) from dual) ccol
from dual
connect by level <= 50000
insert into testtb2
select acol, bcol
from testtb1
insert into testtb3
select acol, ccol
from testtb1
--테스트 테이블 analyze
analyze table testtb1 compute statistics
analyze table testtb2 compute statistics
analyze table testtb3 compute statistics
--테스트 테이블 block 수 측정
select blocks from all_tables where table_name = 'testtb1'
-->50001
select blocks from all_tables where table_name = 'testtb2'
-->187
select blocks from all_tables where table_name = 'testtb3'
-->50001
-------------------------------------------------------
------------------------ 정 리 -----------------------
-------------------------------------------------------
case 1의 경우(간혹 ccol에 데이터가 입력되는 경우)
비정규화된 테이블 testtb1 의 블록 사용수는 2727이지만
정규화된 테이블 testtb2,3의 블록 사용수는 690인 것을 알 수 있음
똑같은 데이터이더라도 정규화했을 때 block 사용량이 줄어들고
따라서 성능에 어느정도 도움이 될 것 같음
case 2의 경우(대부분 ccol에 데이터가 입력되는 경우)
비정규화된 테이블 testtb1 의 블록 사용수는 50001
testtb2, 3 의 블록 사용수는 50188인 것을 알 수 있음
정규화하더라도 block 사용량이 줄어드는 것이 아니라
오히려 늘어났음
-------------------------------------------------------
------------------------ 결 론 -----------------------
-------------------------------------------------------
데이터 입력 패턴에 따라 정규화하는 것이 성능에 유리할 수도 있지만
비정규화하는 것이 성능에 유리할 수도 있음