본문 바로가기

Database

chaper 9 oracle extent & segment 정보확인

 

  1. 테이블스페이스 생성

 

 

CREATE TABLESPACE EXTTBS

DATAFILE 'D:\KHDATA\EXTTBS01.DBF' SIZE 4M

EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO;

-- BLOCK 배수로 할당해 주는 것이 좋다(권장)

 

ALTER TABLESPACE EXTTBS

ADD DATAFILE 'D:\KHDATA\EXTTBS02.DBF' SIZE 4M;

 

 

SELECT *

FROM DBA_DATA_FILES

WHERE TABLESPACE_NAME='EXTTBS';

 

SELECT FILE_NAME, BYTES"할당된 BYTES", BLOCKS"할당된 BLOCKS",

USER_BYTES"현재 사용가능 BYTES", user_BLOCKS"현재 사용가능 BLOCKS"

FROM DBA_DATA_FILES

WHERE TABLESPACE_NAME='EXTTBS';

 

사용된 BLOCKS (할당된 BLOCKS – 현재 사용가능 BLOCKS) 이 8BLOCK인데 이는 FILE HEADER를 위함이다.

  1. 실습을 위해 7개의 테이블 생성

 

CREATE TABLE TBLA

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLB

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLC

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLD

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLE

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLF

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

CREATE TABLE TBLG

(NAME VARCHAR2(10)

)TABLESPACE EXTTBS;

 

 

--테이블을 생성 , 다시 공간 확인

 

SELECT FILE_ID,FILE_NAME, BYTES"할당된 BYTES", BLOCKS"할당된 BLOCKS",

USER_BYTES"현재 사용가능 BYTES", user_BLOCKS"현재 사용가능 BLOCKS",

BYTES-USER_BYTES"현재 사용되고 있는 BYTES",

BLOCKS-USER_BLOCKS"현재 사용되고 있는 BLOCKS"

FROM DBA_DATA_FILES

WHERE TABLESPACE_NAME='EXTTBS';

 

위와 같이 7개의 테이블을 생성하였음에도 불구하고 공간에는 차이가 없음을 알 수 있다.

 

SELECT *

FROM DBA_EXTENTS

WHERE TABLESPACE_NAME='EXTTBS';

 

FILE_ID를 확인해보면 11번 즉, exttbs02.DBF 파일만 사용되고 있음을 확인 할 수 있다.

 

SELECT *

FROM DBA_FREE_SPACE

WHERE TABLESPACE_NAME='EXTTBS';

 

 

65번 블록부터 448번 블록까지 사용할 수 있다는 의미이다.

 

이제 위 테이블 들 중 몇 몇 개를 무작위 순서로 삭제하게 되면, DISK 공간의 단편화가 발생하게 된다. 이를 조각모음해보자.

(기본적으로 연속적으로 빈 공간에 대해서는 하나로 모을 수 있다. 하지만 듬성듬성 빈 공간은 조각모음을 통해 논리적으로 하나의 큰 공간으로 인식시켜 PERFORMANCE를 향상시킬 수 있다.)

 

  1. 테이블스페이스의 삭제

 

이제 TBLB(17), TBLD(33),TBLF(49),TBLG(57)를 삭제하여보자.

 

우선 TBLB를 삭제하고 EXTENT 정보와 FREE_SPACE 정보를 확인한다.

 

DROP TABLE TBLB;

 

SELECT *

FROM DBA_EXTENTS

WHERE TABLESPACE_NAME='EXTTBS';

 

 

SELECT *

FROM DBA_FREE_SPACE

WHERE TABLESPACE_NAME='EXTTBS';

 

    

    위에서 살펴보듯이 TBLB가 삭제되어진 것과 TBLB가 삭제되어지면서 BLOCK_ID 17번부터 8개 BLOCK이 FREE_SPACE로 풀린 것을 확인할 수 있다.

    이와 같은 방식으로 TBL(D와 E,F)를 삭제하여 보면, 아래와 같이 확인 가능하며, 설명은 생략한다.

 

DROP TABLE TBLD;

DROP TABLE TBLF;

 


 

DROP TABLE TBLG;

 

이제 목표했던 테이블들을 모두 삭제하였음으로 다시 사용 중인 BLOCK FREE_SPACE 확인해보면 아래와 같다.

(TBL B,D 삭제되면서 불연속적인 BLOCK 공간의 삭제와 TBL F,G 삭제되면서 연속적인 BLOCK 공간의 삭제를 있다.)

 

 

 

    다시말해 현재 사용되어 지고 있는 공간은 아래와 같이 TBL (A/C/E)`

 

  1. (해결법) FREE_SPACE 통합

 

ALTER TABLESPACE EXTTBS COALESCE;

 

(coalesce 경우 불연속적인 블록의 통합은 불가능하다.

 

Purge recyclebin;

 

가지 방법을 통해 통합이 가능한데..

 

첫번째 방법은

테이블을 삭제할 , purge 옵션을 사용하여 휴지통으로 들어가지 않고 바로 삭제한 , 남아있는 테이블들을 새로운 테이블스페이스로 옮긴다. 그리고 기존 테이블스페이스를 coalesce 시켜 block들을 하나로 묶는다. 그런 , 새로운 테이블스페이스로 옮겼던 데이터들을 기존 테이블스페이스로 옮기면 차례대로 입력되어진다.

 

두번째 방법은

휴지통을 비운 , 정보가 있는 테이블들을 새로운 테이블스페이스로 옮긴다. 그리고 기존 테이블스페이스에서 coalesce 실행하여 기존 테이블스페이스의 block들을 묶어주고, 다시 테이블들을 옮겨주는 방법이 있다. ( 방법의 경우 안될 수도 있다.)

 

SELECT *

FROM DBA_FREE_SPACE

WHERE TABLESPACE_NAME='EXTTBS';

 

위 그림과 같이 8block씩 나뉘어져 있던 테이블 2개가 통합(Merge)되어 단일 block으로 묶인 것을 확인할 수 있다.