Data Base/Linux

231213 Linux_DB, OS DB

잇꼬 2023. 12. 13. 19:43
728x90
반응형
SMALL

■ 오라클은 데이터를 논리적으로 tablespace 에 저장하고 물리적으로 data file 저장한다.

출처) oracle help center

■ tablespace

1. 오라클 데이터베이스는 데이터를 tablespace 저장

2. tablespace 하나 이상의 data file 로 구성한다.

3. tablespace 는 하나 이상의 segment 로 구성한다.

 

■  data file

1. data file은 oracle server 에 실행중인 운영체제(OS)를 따르는 물리적 구조이다.

2. tablespace 는 data file 이라고 하는 하나 이상의 파일로 구성되어 있다. 

 

■ segment 

1. segment 는 tablespace 안의 특정 논리적 저장 영역 구조에 할당된 영역이다.

2. 테이블, 인덱스, undo, LOB(lock) 등 오라클이 제공하는 논리적 공간을 의미한다.

3. segment 는 tablespace 에 속한 여러 data file 로 확정할 수 있다.

 

■ extent

1. 하나 이상의 extent 로  segment 를 구성한다.

2. extent : 연속된 oracle block 집합

3. 2차원 배열식으로 조각나눈다.

 

■ block

1. 오라클 데이터베이스의 data(row) 는 block에 저장된다.

2. oracle 의 최소 I/O 단위

3. 오라클이 사용할 수 있는 block 크기 : 2k, 4k, 8k, 16k, 32k

4. db_block_size 파라미터로 기본 크기를 결정한다.

5. 오라클 블록은 하나 이상의 OS 블록을 가지고 생성한다.

 

출처:docs.oracle /  Database Concepts


object = table, index, undo, LOB(lock) = segment

 

■ tablespace 생성

# 로컬로 관리하는 테이블스페이스

1. 사용 가능한 extent 에 대해서 테이블스페이스 (자기 스스로) 에서 관리하는 방식

2. 비트맵은 사용 가능한 확장영역(extent)을 기록하는데 사용한다.

CREATE TABLESPACE userdata
DATAFILE '/u01/app/oracle/oradata/ora11g/userdata01.dbf' size 100m
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1m;

 

# 딕셔너리 관리 테이블스페이스

1. 사용가능한 extent 에 대해서 데이터 딕셔너리에서 관리한다.

                        fet$ : free extent 확인

                        uet$ : 사용한 extent 확인

2. extent 할당(segmetn 생성)하거나 할당 해제(drop sement) 할 때 딕셔너리 테이블에 대해서 갱신이 발생한다. 

3. enq : ST - connention : wait event

CREATE TABLESPACE dict_tab DATAFILE
    '/u01/app/oracle/oradata/ora11g/dict_tab01.dbf' SIZE 100m
EXTENT MANAGEMENT DICTIONARY DEFAULT STORAGE(iniatl 1m NEXT 1m PCTINCREASE 0 );
-- 딕셔너리 관리를 실행한다                   첫번째 1M 두번째 1M, 세번째 (두번째를기준으로생성) 0 으로 균일하게 생성

 

#  manual 로 생성

CREATE TABLESPACE flm_tab
DATAFILE '/u01/app/oracle/oradata/ora11g/flm_tab01.dbf' SIZE 5m
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1m
SEGMENT SPACE MANAGEMENT MANUAL;

# FLM_TAB 확인

SELECT * 
FROM dba_tablespaces;

 

# FLM_TAB 확인

SELECT * 
FROM dba_data_files;

 

# 테이블 생성하면서 tablespace 같이 설정

CREATE TABLE hr.emp
TABLESPACE flm_tab
AS SELECT * FROM hr.employees;

SELECT * FROM dba_tables WHERE owner = 'HR' AND table_name='EMP';
SELECT * FROM dba_segments WHERE owner = 'HR' AND segment_name='EMP';
SELECT * FROM dba_extents WHERE owner = 'HR' AND segment_name='EMP';

 

# block 형태


# HEADER : 행의 정보 

# DATA 저장공간 : ROW DATA

 

# row Migration 현상 (=: 이사)

Data 저장공간 full 찾을경우, 

예) update문 row4 기준으로 실행

(출처: https://antognini.ch/2016/10/whats-the-difference-between-row-migration-and-row-chaining/)
commit;

select 문을 실행했을 경우

full 로 되어있어 다른 block 을 생성해서
row4를 생성한다.

문제) block 을 2번 이상 건드려서 찾아야 한다.

 

# PCTFREE & PCTUSED




(출처: https://blog.naver.com/itperson/220879812591)
(위의 예시를 그래도 진행)

한개의 row를 2개 이상의 block 을 비효율적이다.
이럴경우에는 PCTFREE 를 생성

※ PCTFREE란?
ⓐ 기존 row 들의 증가분(update) 때문에 남겨놓는 여유공간이다.
transaction slot 생성할 수 있는 공간

PCTFREE 공간이 없다면?
ⓐ I/O 성능이 떨어진다.
ⓑ ROW MIGRATION 현상이 발생한다.

※ PCTUSED란?
INSERT문 시에 기존 block 을 재사용할 수 있는 지를 판단하는 기준

PCTUSED 기준으로 
ⓐ 기준치보다 낮을 경우 재사용 가능
ⓑ 기준치보다 높을 경우 재사용 불가

 

 

# Freelists 

header (extent 관리)

※ Freelists 란?
테이블 또는 테이블 파티션에 대한 여러 프리 리스트.


비유적 설명)

다수의 사람들이 놀이터에 있는 여러가지의 장난감을 갖고 놀려고 한다. 장난감은 큰 박스 하나의 한꺼번 담아져 있다. 여기서 큰 박스를 Freelists 라 생각하면 된다. 동시에 장난감이 든 박스를 달려들 경우에는, 혼돈이 될 것이다. 그래서 여러 종류의 장난감들을 박스별로 분류하는 것이 가장 좋은 것이다. 
이처럼 Freelists 가 1 인 것보단 여러개이면 동시에 접근해도 혼돈이 오는 것을 방지 할 수 있다.

예)
A session 에서 insert문 9:00 실행
B session 에서 insert문 9:01 실행
Freelist 1 일 경우, 

실행되는 문장은 A의 insert문이다. 
B 에게는 buffer busy wait 로 확인.

이럴 경우에는 Freelists 를 늘려주는 작업을 실행해야 SQL문장이 기다리는 일 없다.

문제) 동시에 INSERT문의 성능이 저하된다.

 

 

728x90
반응형
LIST