병렬 DDL

병렬 DDL은 오라클 병렬 기술의 핵심

사용자 트랜젝션이 발생하면 병렬처리 시 자원할당이 어려워지며 실제 업무에 병렬처리 적용이 어려워지지만
다운타임을 더 적게 발생시키 위한 신속한PDDL이 필요함

병렬작업이 가능한 DDL

  • CREATE INDEX: 여러 병렬 실행 서버로 테이블 스캔, 데이터 정렬 및 정렬된 세그먼트로 인덱스 구조를 생성한다 .
  • CREATE TABLE AS SELECT: 이 쿼리의 SELECT는 병렬 쿼리를 사용해서 수행하고, 테이블에 로드자체도 병렬로 수행한다.
  • AL TER INDEX REBUILD : 인덱스 구조를 병렬로 리빌드한다.
  • AL TER T ABLE MOVE: 테이블을 병렬로 이동한다.
  • ALTER TABLE SPLIT or COALESCE PARTITION: 한 개의 테이블 파티션을 병렬로 분할 또는 병합한다.
  • AL TER INDEX SPLIT PARTITION : 인덱스 파티션을 병렬로 분할한다.

병렬 DDl콰 External 테이블을 시용한 데이터 로딩

대량적재 시 단편화가 생기는 테스트를 위해 external 테이블로 데이터를 로딩하는 방법을 설명하고 있으나 주제와 관련없다고 판단하고 skip함

병렬 DDl과 익스텐트 트리밍

상황 :
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 처리가 정상적으로 완료되었습니다.

  • 8블록, 128블록, 1024블록을 제외한 나머지는 익스텐트 트리밍으로 인해 발생한 것
  • AutoAllocate할당 방식은 시간이 지남에 따라 더 많은 익스텐트가 발생될 것이지만 공간효율성은 매우 우수하다