반응형
12c의 컬럼 visiable 기능을 이용하여 테이블의 컬럼을 수정하는 것을 이전 글에서 포스팅한 적이 있었습니다.
https://bae9086.tistory.com/247
이번에는 대용량 테이블(약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만건의 데이터를 다시 넣어줘야 하기 때문)
대용량 테이블에서도 안정성 있게 사용할 수 있는것을 테스트를 통해 확인하였습니다.
반응형
'Oracle > 운영' 카테고리의 다른 글
통계정보 관련 딕셔너리 뷰 (0) | 2021.11.11 |
---|---|
테이블 파티션 Split,Merge,Coalesce (0) | 2021.11.08 |
다른 스키마(유저) Database link 삭제하기 (0) | 2021.10.27 |
Unusable Index를 Skip하고 scan하는 파라미터 skip_ususable_indexes (0) | 2021.10.26 |
다른 유저 테이블 Truncate 시키는 권한 (0) | 2021.10.25 |
댓글