본문 바로가기
Oracle/운영

대용량 테이블 컬럼 순서 변경 테스트(12c new feature column visiable 기능 사용)

by 취미툰 2021. 11. 3.
반응형

12c의 컬럼 visiable 기능을 이용하여 테이블의 컬럼을 수정하는 것을 이전 글에서 포스팅한 적이 있었습니다.

https://bae9086.tistory.com/247

 

테이블 컬럼 순서 변경방법(Oracle,Tibero,Mysql,MSSQL)

테이블 컬럼의 순서를 변경하는 방법에 대해서 각 DB에 따라 방법을 정리해보았습니다. Oracle oracle의 경우 12c를 기준으로 나뉩니다. 12c의 신기술을 사용해서 기존 버전보다 편하게 컬럼의 순서를

bae9086.tistory.com

이번에는 대용량 테이블(약7GB)의 테이블을 컬럼 자리 변경 테스트를 했을 때 시간은 어떻게 되는지 한번 테스트해보겠습니다.

 

 

1.테이블 생성

create table col_test as
select level as id,dbms_random.string('A',10) as name,dbms_random.string('P',40) as address,ceil(dbms_random.value(1,100000)) as salary
from dual
connect by level <=100000;

--초기 테이블 8 MB
SQL> select bytes/1024/1024 as MB from dba_segments where segment_name='COL_TEST';

        MB
----------
         8
         
         
--테이블 복사로 7GB 만들기

insert into col_test
select * from col_test;
 
 ...
51200000 rows created.
 로 계속 수행
 
 
 테이블 row수와 크기 확인
 SQL> select bytes/1024/1024 as MB from dba_segments where segment_name='COL_TEST';

        MB
----------
      7400
	  

COL VISIBLE INVISIBLE 테스트 (7400MB)

SQL> select count(*) from col_test;

  COUNT(*)
----------
 102400000

 

 

2..컬럼 순서 확인

SQL> desc col_test;
 Name                                                                     Null?    Type
 ------------------------------------------------------------------------ -------- -------------------------------------------------
 ID                                                                                NUMBER
 NAME                                                                              VARCHAR2(4000)
 ADDRESS                                                                           VARCHAR2(4000)
 SALARY                                                                            NUMBER

 

 

3.맨뒤에 있는 SALARY를 ID와 NAME 사이로 이동

(방법은 invisiable 후 원하는 컬럼순서 대로 다시 visiable 합니다)

SQL> alter table col_test modify salary invisible;

Table altered.

Elapsed: 00:00:00.17
SQL> alter table col_test modify address invisible;

Table altered.

Elapsed: 00:00:00.03
SQL> alter table col_test modify name invisible;

Table altered.

Elapsed: 00:00:00.03
SQL> alter table col_test modify salary visible;

Table altered.

Elapsed: 00:00:00.08
SQL> alter table col_test modify name visible;

Table altered.

Elapsed: 00:00:00.03
SQL> alter table col_test modify address visible;

Table altered.

Elapsed: 00:00:00.03
SQL> desc col_test;
 Name                                                                     Null?    Type
 ------------------------------------------------------------------------ -------- -------------------------------------------------
 ID                                                                                NUMBER
 SALARY                                                                            NUMBER
 NAME                                                                              VARCHAR2(4000)
 ADDRESS                                                                           VARCHAR2(4000)


SQL> select count(*) from col_test;

  COUNT(*)
----------
 102400000

Elapsed: 00:00:12.78


SQL> select bytes/1024/1024 as MB from dba_segments where segment_name='COL_TEST';

        MB
----------
      7470

테스트 결과 한 row를 invisiable/visiable 할때 걸리는 시간은 약 10억건의 row가 있음에도 0.03초만에 수행되는 것을 확인 할 수 있습니다.

 

기존의 drop column add column으로 할때보다 더 안정성 있는 방식임에는 틀림없는 것 같습니다.

추가로 데이터가 있는 row의 경우 drop column 후 add column 시에는 시간이 더 걸릴 것으로 예상됩니다.(10만건의 데이터를 다시 넣어줘야 하기 때문)

 

대용량 테이블에서도 안정성 있게 사용할 수 있는것을 테스트를 통해 확인하였습니다.

반응형

댓글