병렬 DDL은 오라클 병렬 기술의 핵심
사용자 트랜젝션이 발생하면 병렬처리 시 자원할당이 어려워지며 실제 업무에 병렬처리 적용이 어려워지지만
다운타임을 더 적게 발생시키 위한 신속한PDDL이 필요함
대량적재 시 단편화가 생기는 테스트를 위해 external 테이블로 데이터를 로딩하는 방법을 설명하고 있으나 주제와 관련없다고 판단하고 skip함
상황 :
1. 100MB의 익스텐트를 갖는 테이블스페이스에 1010 MB 의 데이터 (약 1GB)를 로드
2. 10개의 병렬 실행 서버 사용 (각각 101 MB 로드)
3. 20개의 익스텐트가 할당(10개는 가득 차고 10개는 1 MB만 참)
이때 오라클의 익스텐트 할당방식에 따라 Storage 저장 시 비효율이 발생될 수 있음.
익스텐트 트리밍과 Locally - Managed (Uniform) 테이블스페이스
익스텐트 트리밍을 실행하지 않는다.
모든 익스텐트는 같은 크기로,정해진 크기보다 크거나 작을 수 없다.
익스텐트 트리밍과 Locally - Managed (AutoAllocate) 테이블스페이스
빈 공간을 모두 사용할 목적으로 Free Extent의 크기에 맞게 요청크기를 줄일 수 있다.
SQL> set serveroutput on
SQL>
SQL> alter table big_table PARALLEL 4;
테이블이 변경되었습니다.
SQL> create tablespace lmt_uniform
2 datafile 'F:\app\oradata\lmt_uniform.dbf' size 1048640K reuse
3 autoextend on next 100m
4 extent management local
5 uniform size 100m;
테이블스페이스가 생성되었습니다.
SQL> create tablespace lmt_auto
2 datafile 'F:\app\oradata\lmt_auto.dbf' size 1048640K reuse
3 autoextend on next 100m
4 extent management local
5 autoallocate;
테이블스페이스가 생성되었습니다.
SQL> create table uniform_test
2 parallel
3 tablespace lmt_uniform
4 as
5 select * from big_table;
테이블이 생성되었습니다.
SQL> create table autoallocate_test
2 parallel
3 tablespace lmt_auto
4 as
5 select * from big_table;
테이블이 생성되었습니다.
SQL> -- 다른 세션에서 모니터링 (병렬로 생성되고 있음을 확인하기 위해서)
SQL> select sid, serial#, qcsid, qcserial#, degree
2 from v$px_session;
SID SERIAL# QCSID QCSERIAL# DEGREE
---------- ---------- ---------- ---------- ----------
38 6 33 7 16
65 13 33 7 16
161 37 33 7 16
193 22 33 7 16
223 10 33 7 16
66 6 33 7 16
101 6 33 7 16
129 6 33 7 16
163 5 33 7 16
192 37 33 7 16
224 31 33 7 16
9 12 33 7 16
35 44 33 7 16
68 10 33 7 16
102 12 33 7 16
130 10 33 7 16
33 7 33
17 개의 행이 선택되었습니다.
SQL> select segment_name, blocks, extents
2 from user_segments
3 where segment_name in ( 'UNIFORM_TEST', 'AUTOALLOCATE_TEST' );
SEGMENT_NAME BLOCKS EXTENTS
--------------------------------------------------------------------------------- ---------- ----------
AUTOALLOCATE_TEST 147248 1276
UNIFORM_TEST 332800 26
SQL> exec show_space('UNIFORM_TEST' );
Unformatted Blocks ..................... 186,519
FS1 Blocks (0-25) ..................... 0
FS2 Blocks (25-50) ..................... 0
FS3 Blocks (50-75) ..................... 0
FS4 Blocks (75-100)..................... 0
Full Blocks ..................... 144,933
Total Blocks............................ 332,800
Total Bytes............................. 2,726,297,600
Total MBytes............................ 2,600
Unused Blocks........................... 0
Unused Bytes............................ 0
Last Used Ext FileId.................... 7
Last Used Ext BlockId................... 307,328
Last Used Block......................... 12,800
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> exec show_space('AUTOALLOCATE_TEST' );
Unformatted Blocks ..................... 0
FS1 Blocks (0-25) ..................... 0
FS2 Blocks (25-50) ..................... 0
FS3 Blocks (50-75) ..................... 0
FS4 Blocks (75-100)..................... 71
Full Blocks ..................... 144,932
Total Blocks............................ 147,248
Total Bytes............................. 1,206,255,616
Total MBytes............................ 1,150
Unused Blocks........................... 0
Unused Bytes............................ 0
Last Used Ext FileId.................... 8
Last Used Ext BlockId................... 144,128
Last Used Block......................... 128
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select segment_name, extent_id, blocks
2 from user_extents where segment_name = 'UNIFORM_TEST';
SEGMENT_NAME EXTENT_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ----------
UNIFORM_TEST 0 12800
UNIFORM_TEST 1 12800
UNIFORM_TEST 2 12800
UNIFORM_TEST 3 12800
UNIFORM_TEST 4 12800
UNIFORM_TEST 5 12800
UNIFORM_TEST 6 12800
UNIFORM_TEST 7 12800
UNIFORM_TEST 8 12800
UNIFORM_TEST 9 12800
UNIFORM_TEST 10 12800
UNIFORM_TEST 11 12800
UNIFORM_TEST 12 12800
UNIFORM_TEST 13 12800
UNIFORM_TEST 14 12800
UNIFORM_TEST 15 12800
UNIFORM_TEST 16 12800
UNIFORM_TEST 17 12800
UNIFORM_TEST 18 12800
UNIFORM_TEST 19 12800
UNIFORM_TEST 20 12800
UNIFORM_TEST 21 12800
UNIFORM_TEST 22 12800
UNIFORM_TEST 23 12800
UNIFORM_TEST 24 12800
UNIFORM_TEST 25 12800
26 개의 행이 선택되었습니다.
SQL> select segment_name, blocks, count(*)
2 from user_extents
3 where segment_name = 'AUTOALLOCATE_TEST'
4 group by segment_name, blocks
5 /
SEGMENT_NAME BLOCKS COUNT(*)
--------------------------------------------------------------------------------- ---------- ----------
AUTOALLOCATE_TEST 128 998
AUTOALLOCATE_TEST 120 1
AUTOALLOCATE_TEST 368 3
AUTOALLOCATE_TEST 1016 7
AUTOALLOCATE_TEST 1024 8
AUTOALLOCATE_TEST 320 2
AUTOALLOCATE_TEST 8 256
AUTOALLOCATE_TEST 288 1
8 개의 행이 선택되었습니다.
SQL> -- 추가적인 입력이 발생하면 uniform 사용시 비효율이 누적된다
SQL> insert /*+ append */ into UNIFORM_TEST
2 select * from big_table;
10000000 개의 행이 만들어졌습니다.
SQL> insert /*+ append */ into AUTOALLOCATE_TEST
2 select * from big_table;
10000000 개의 행이 만들어졌습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> exec show_space( 'UNIFORM_TEST' );
Unformatted Blocks ..................... 373,042
FS1 Blocks (0-25) ..................... 0
FS2 Blocks (25-50) ..................... 0
FS3 Blocks (50-75) ..................... 0
FS4 Blocks (75-100)..................... 0
Full Blocks ..................... 289,862
Total Blocks............................ 665,600
Total Bytes............................. 5,452,595,200
Total MBytes............................ 5,200
Unused Blocks........................... 0
Unused Bytes............................ 0
Last Used Ext FileId.................... 7
Last Used Ext BlockId................... 422,528
Last Used Block......................... 12,800
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> exec show_space( 'AUTOALLOCATE_TEST' );
Unformatted Blocks ..................... 0
FS1 Blocks (0-25) ..................... 0
FS2 Blocks (25-50) ..................... 0
FS3 Blocks (50-75) ..................... 0
FS4 Blocks (75-100)..................... 123
Full Blocks ..................... 289,864
Total Blocks............................ 294,392
Total Bytes............................. 2,411,659,264
Total MBytes............................ 2,299
Unused Blocks........................... 0
Unused Bytes............................ 0
Last Used Ext FileId.................... 8
Last Used Ext BlockId................... 297,600
Last Used Block......................... 368
PL/SQL 처리가 정상적으로 완료되었습니다.