Oracle 테이블 관리 및 활용 (14)


Create table emp_family
(empno NUMBER(4) NOT NULL,
 fam_name VARCHAR2(10) NOT NULL,
 relation VARCHAR2(10) NOT NULL,
 birthday DATE NOT NULL,
 age       NUMBER,
constraint emp_family_pk  PRIMARY KEY (empno, fam_name)
 );

 참조무결성이 깨지지 않기 위해 특정 명령어가 없으면 테이블 드랍이 되지 않는다
(Foreign 키가 다른 테이블과 묶인 경우)




특정 칼럼 지우는 경우

어떤 데이터가 저장할 공간이 필요한데 스페이스가 꽉 찬 경우
20mb를 어디다 저장할까?

o Row chaining  o Row Migration

하나의 블럭이 다른 블럭에 연결 된 경우.
오라클의 기본 I/O단위는 블럭단위이다.
한건의 데이터를 조회 할 때 하나의 블럭에서 처리가 다 끝나야 효율적이다.
만약 두 블럭사이가 chaining 되어 있다면 시간면에서 지연이 된다.



Row chaining을 줄이자.
해당 블럭을 아예 이사시켜서 다른 블럭에 이동하자.
하지만 가장 좋은건 체이닝과 migration을 하지 않는 경우가 좋다.

그래서 대안으로 나온 것이 밑에 두가지 개념이다. 

o PCTFREE   ?

o PCTUSED  ?

PCTFREE
  블럭내에 이미 존재하고 있는 Row에 Update가 가능하도록 예약시켜 놓는 블럭의 퍼센트 값을 지정 합니다.
예로 "PCTFREE 20" 으로 설정을 하면, 데이터 블록의 20%를 사용 가능한 빈 영역으로 유지하여 각 블록에 있는 행을 갱신하는데 사용한다는 의미입니다.

  PCTFREE의 기본값은 10% 입니다.

  PCTFREE와 PCTUSED의 합이 100을 초과하지 않는 범위 내에서 0에서 99까지의 값을 PCTFREE 값으로 사용할 수 있습니다. INDEX값은 수정이 자주 발생하지 않으므로 PCTFREE는 5%정도가 적당합니다.

PCTFREE가 적을 경우
  - 기존 테이블 행 갱신에 의한 확장을 위해 적은 공간을 확보 합니다.
  - 많은 로우가 한 블럭에 입력 가능합니다.
  - 수정이 적은 세그먼트에 적합 합니다.

PCTFREE가 클 경우
  - 블럭당 적은 row가 입력됩니다. 즉 같은 row를 입력하기 위해서 많은 블럭이 소요 됩니다.- 행 조각을 자주 체인화할 필요가 없으므로 수정 수행 속도가 증가 합니다.
- 자주 수정되는 세그먼트에 적합 합니다.

PCTUSED
  오라클 서버가 테이블의 각 데이터 블록에 대해 유지하려는 사용 공간의 최소 백분율로써 데이터 세그먼트에 대해 지정합니다
예로 "PCTUSED 40" 으로 설정하면, 데이터 블록의 사용영역이 39%보다 적어지지 않으면 새로운 행을 삽입할 수 없음을 의미 합니다.

 PCTUSED의 기본값은 40% 입니다.

PCTUSED값이 적을 경우
  - 블록이 재사용되는 일이 적어질 수 있으므로 처리 비용이 감소 합니다.
 - 데이터베이스에서 사용되지 않은 공간이 증가 합니다.

PCTUSED값이 클 경우
  - 블록이 재사용되는 일이 많아질 수 있으므로 처리 비용이 증가 합니다.
 - 공간 사용도를 향상 시킵니다.

PCTFREE와 PCTUSED값을 선택하는 예
① UPDATE시 ROW의 크기가 증가 될 때
- PCTFREE = 20
- PCTUSED = 40
② Insert, Delete가 자주 발생하지만 Update시 ROW의 크기가 증가 되지 않을 때
- PCTFREE = 5
- PCTUSED = 60
③ 테이블이 매우 크지만 대부분 Read Only Transaction 일 때
- PCTFREE = 5
- PCTUSED = 90
PCTFREE = 20 / PCTUSED = 40 일 경우









0 comments:

Post a Comment