카테고리 없음

[오라클] 오라클 스토리지 개념 이해하기

Dong538 2021. 12. 3. 09:34

구조

운영 체제 블록: 오라클 스토리지에서 가장 작은 단위이자 운영 체제의 I/O 단위이다. 운영 체제 블록이 모여 하나의 데이터 블록을 구성한다. 

데이터 파일: 디스크에 존재하는 실제 파일. 데이터 파일이 모여 테이블스페이스를 구성한다. 

데이터 블록: 여러 개의 운영 체제 블록으로 구성되고 오라클 데이터베이스의 I/O 단위이다. 
데이터 블록에는 여러 로우 저장된다. 여기서 단위라는 말의 의미는 원하는 로우를 추출하기 위해 동일 데이터 블록 내 다른 로우도 메모리에 적재되는 구조인 것이다. 블록의 크기는 원하는만큼 설정할 수 있는데 크기에 따라 장단점이 존재한다.
데이터 블록이 클수록 블록 사용률이 높고, 한번의 I/O로 많은 데이터를 추출할 수 있는 장점이 있다. 반면 블록에 대한 경합 가능성도 높다.

데이터 블록에 설정할 수 있는 옵션은 INITRANS, MAXTRANS, PCTFREE, PCTUSED가 있다. 
INITRANS: 데이터 블록 생성 시 초기 트랜잭션 슬롯 개수, 테이블에 대한 데이터 블록 1, 인덱스에 대한 데이터 블록 2를 기본값으로 한다.
MAXTRANS: 최대 트랜잭션 슬롯 개수
PCTFREE: 여유 공간 크기, 기본값은 블록 크기의 10%. LOW MIGRATION 방지한다. 
행 이전: 하나의 데이터 추출 시 많은 데이터 블록을 액세스하므로 성능 저하 발생할 수 있다. 해당 문제 해결을 위해 테이블 재구성 작업을 수행해야 한다. 
테이블 재구성: 테이블 재생성한 후 전체 데이터를 옮기는 것이다. 
PCTUSED: 수동 세그먼트 공간 관리 방식 사용 시, 데이터 블록 사용률값이다. 기본값은 데이터 블록 크기의 40%이다. 

데이터 블록에 설정된 옵션들은 USER_TABLES나 DBA_TABLES를 검색해서 값을 확인할 수 있다. 자동 세그먼트 공간 관리 방식의 테이블스페이스에 'EMP' 테이블이 존재할 경우, DBA_INDEXES에는 PCT_USED 컬럼이 추출되지 않는다. 

SQL> SELECT PCT_FREE, PCT_USED, INI_TRANS, MAX_TRANS FROM USER_TABLES WHERE TABLE_NAME = 'EMP';

  PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS
---------- ---------- ---------- ----------
        10         40          1        255

SQL> SELECT PCT_FREE, PCT_USED, INI_TRANS, MAX_TRANS FROM DBA_TABLES WHERE TABLE_NAME = 'EMP';

  PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS
---------- ---------- ---------- ----------
        10         40          1        255

SQL> SELECT PCT_FREE, PCT_USED, INI_TRANS, MAX_TRANS FROM DBA_INDEXES WHERE TABLE_NAME = 'EMP';
SELECT PCT_FREE, PCT_USED, INI_TRANS, MAX_TRANS FROM DBA_INDEXES WHERE TABLE_NAME = 'EMP'
                 *
ERROR at line 1:
ORA-00904: "PCT_USED": invalid identifier


행 이전, 행 연결 확인:

SQL> SELECT NUM_ROWS, CHAIN_CNT
  2  FROM DBA_TABLES
  3  WHERE TABLE_NAME='EMP';

  NUM_ROWS  CHAIN_CNT
---------- ----------


SQL> SELECT * FROM USER_USERS;

USERNAME      USER_ID ACCOUNT_STATUS                   LOCK_DAT EXPIRY_D DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE           LOCAL_TEMP_TABLESPACE          CREATED  INITIAL_RS EXTERNAL_N P COM O INH DEFAULT_CO IMP ALL PASSWORD
---------- ---------- -------------------------------- -------- -------- ------------------------------ ------------------------------ ------------------------------ -------- ---------- ---------- - --- - --- ---------- --- --- --------
SYS                 0 OPEN                                      22/05/17 SYSTEM                         TEMP                           TEMP                           21/11/18 SYS_GROUP             N YES Y YES USING_NLS_ NO  NO  21/11/18

BEGIN
DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME=>'SCOTT',
TABNAME=>'EMP',
ESTIMATE_PERCENT=>10,
METHOD_OPT=>'AUTO',
DEGREE=>4,
CASCADE=>TRUE);
END;
/


익스텐트: 다수의 연속 데이터 블록으로 구성되며 데이터베이스 스토리지 공간 할당의 논리적 단위이다. 하나 이상의 익스텐트가 세그먼트를 구성한다. 
DELETE VS. TRUNCATE: A 테이블의 MINEXTENTS가 2, 익스텐트 하나의 크기는 1MB라고 가정하자. DELETE. TRUNCATE 명령 모두 데이터는 전부 삭제된다. 그러나 DELETE 명령 후에 테이블 크기는 변하지 않는다. 즉 익스텐트가 할당 해제되지 않는다. TRUNCATE는 MINEXTENTS 옵션 설정값 만큼의 익스텐트만을 남기고 나머지는 할당 해제된다. 

익스텐트 정보 검색 예:

SQL> COLUMN FILE_NAME FORMAT A10
SELECT A.FILE_NAME, B.EXTENT_ID, B.BLOCKS, B.BYTES/102
FROM DBA_DATA_FILES A, DBA_EXTENTS B
WHERE A.FILE_ID = B.FILE_ID
  4  AND B.SEGMENT_NAME='EMP';

FILE_NAME   EXTENT_ID     BLOCKS B.BYTES/102
---------- ---------- ---------- -----------
/u01/app/o          0          8  642.509804
racle/orad
ata/ORCL/s
ystem01.db
f


테이블스페이스가 가지고 있는 사용 가능한 연속된 공간 정보 확인:

SQL> SELECT * FROM DBA_FREE_SPACE;

TABLESPACE    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
SYSTEM              1     112752     131072         16            1
SYSTEM              1     113536   13631488       1664            1
SYSAUX              2      68272   38404096       4688            2
UNDOTBS1            3        288     196608         24            3
UNDOTBS1            3        320     983040        120            3


세그먼트: 세그먼트는 테이블스페이스 내의 특정 논리적 스토리지 구조에 대한 모든 데이터를 포함하는 익스텐트 세트입니다. 예를 들어, 각 '테이블'에 대해 Oracle은 해당 테이블의 데이터 세그먼트를 형성하기 위해 하나 이상의 익스텐트를 할당하고 각 '인덱스'에 대해 Oracle은 인덱스 세그먼트를 형성하기 위해 하나 이상의 익스텐트를 할당한다.

세그먼트 공간 관리 방식: 수동 - 프리리스트 이용 / 자동(ASSM) - 비트맵 이용

오브젝트 종류
실제 물리적 공간을 가지는 오브젝트(세그먼트): 테이블, 인덱스, 클러스터, 파티션, 파티션 인덱스
시스템 테이블스페이스에 정의만 저장되는 오브젝트: 뷰, 시퀀스

세그먼트 관리 

세그먼트의 데이터 블록 단편화: 세그먼트 생성 후 DML 많이 발생하면 세그먼트 중간 중간에 미사용 공간이 발생하는 현상. 
  문제점:
1. 테이블 전체 조회 소요 시간 증가
2. 인덱스 레벨 깊어짐
3. 하나의 데이터 블록 조회 시 적은 로우 추출, 디스크 I/O 증가
4. 빈 데이터 블록 증가로 인해 디스크 공간 낭비 
테이블 재생성, 인덱스 리빌드, 테이블 MOVE 시 단편화 해결할 수 있지만, 재구성을 위한 추가공간이 필요하고, 서비스 정지 시간이 증가한다. 

테이블 재구성 절차:
1. 대상 테이블인 A 테이블과 구조가 동일한 A_임시 테이블을 생성한다.
2. 대상 테이블 A 테이블의 데이터를 A_임시 테이블로 저장한다. 다이렉트 로딩 방식 또는 일단 데이터 로딩 방식 사용 가능.
3. 대상 테이블 이름을 A_백업으로 변경, A_임시 테이블 이름을 A 테이블로 변경한다. 

이 외에 테이블 MOVE, 온라인 세그먼트 축소는 단순 명령어로 수행할 수 있다. 

  테이블 재구성 테이블 MOVE 온라인 세그먼트 축소
절차 복잡함 단순함 단순함
작업 중 서비스 불가능 가능 가능
수행 시간 빠름 빠름 보통
추가 필요 공간 대상 테이블 크기만큼 대상 테이블 크기만큼 불필요
인덱스 재구성 재구성 필요 불필요 불필요
행 이전 해결 해결 부분 해결


온라인 세그먼트 축소:
- 블록 단편화 문제에 대해 위 방법을 적용하면, 미사용 데이터 블록을 할당 해제하여 동일 테이블스페이스내의 다른 세그먼트가 사용할 수 있다. 
- 온라인으로 세그먼트를 축소하더라도 세그먼트의 단편화가 심한 경우 많은 트랜잭션이 발생하므로 작업 시간을 정해야 서비스 영향을 감소시킬 수 있다. 
- 온라인 세그먼트 축소는 인덱스 깊이를 감소시키지 않으므로 인덱스 성능 향상에는 효과가 없다. 인덱스 성능의 향상을 위해서는 인덱스 재구성을 수행한다.