본문 바로가기
Dev/Oracle

[Oracle] PCTFREE, PCTUSED

by 흰바다제비 2022. 6. 9.
728x90

PCTFREE

UPDATE할 때 늘어나는 데이터를 수용하기 위한 공간. 기존에 존재하던 ROW를 UPDATE하며 ROW DATA의 길이가 늘어날 것에 대비하기 위한 여유공간.

  • PCTFREE 값이 적을 경우
    • 한 데이터 블록에 많은 ROW DATA를 입력할 수 있다.
    • UPDATE 작업량이 적은 세그먼트에 적합하다
    • 너무 낮을 경우 헤더 데이터가 저장될 공간이 줄어들고, ROW MIGRATION 현상이 생길 수 있다.
  • PCTFREE 값이 클 경우
    • 한 데이터 블록에 적은 ROW DATA를 입력할 수 있다. (PCTFREE 값이 적을 경우와 비교해서, 같은 양의 ROW DATA를 입력하기 위해 더 많은 데이터 블록을 사용해야 한다.)
    • UPDATE 작업이 많은 세그먼트에 적합하다.
    • 실제 데이터가 저장될 영역이 줄어들어 공간 활용도가 낮아진다.

→ UPDATE 를 적게 하거나, UPDATE 를 해도 ROW의 크기가 증가하지 않을 때는 PCTFREE 값을 낮추고,

UPDATE 를 자주 하면 PCTFREE 값을 높여서 설정하는 것이 좋다.

 

PCTUSED

FREE SPACE가 PCTFREE값이 되면, 사용된 공간이 PCTUSED 이하의 값이 될때까지 새로운 데이터를 추가하지 않는다.

[그림 1]                                                                                   [그림 2]

 

PCTFREE = 10%, PCTUSED = 40%인 데이터블록이다.

기존에 20% 정도를 차지하고 있던 ROW DATA가 [그림 1] 점점 쌓여 90%까지 데이터 공간을 모두 차지하였다. 남아있는 FREE SPACE = PCTFREE 값이 되었다. [그림 2]

이 때는 오라클에서 더 이상 이 데이터 블록에 데이터를 저장하지 않는다.

[그림 3]                                                                                   [그림 4]

 

 

그런데 필요없는 ROW DATA를 삭제하다 보니 데이터 블록의 공간이 어느정도 줄어들게 되었다. [그림 3] 이 때는 이 데이터 블록에 데이터를 저장할 수 있을까? 그렇지 않다.

오라클은 데이터 블록의 데이터가 PCTUSED 값인 40% 이하로 내려가지 않으면 여전히 해당 데이터 블록에 데이터를 저장하지 않는다

그러다가 [그림 4]와 같이 데이터 블록의 ROW DATA가 40% 이하로 줄어들었을 때 FREELISTS에 해당 데이터 블록을 등록하고, 다시 데이터를 받아들이며 데이터 블록을 재사용한다.

설정한 값 이하로 내려가지 않으면 더 이상 이 데이터 블록에 데이터를 저장하지 않고, 해당 데이터 블록을 FREELISTS에 등록하지 않은 채 내버려둔다.

설정한 값 이하로 내려가면 해당 데이터 블록을 FREELISTS에 등록하고 다시 데이터를 받아들이게 된다. (재사용 가능)

  • PCTUSED 값이 적을 경우
    • 블록이 재사용 되는 일이 적다.
    • 사용되지 않은 공간이 증가한다. 공간 활용도가 낮아진다.
  • PCTUSED값이 클 경우
    • 블록이 재사용되는 일이 많다.
    • 공간 활용도를 향상시킨다.
    • FREELISTSDP 데이터 블록 등록/제거를 반복하므로 처리 비용이 증가한다.

→ 데이터 INSERT와 DELETE 작업이 빈번하다면 PCTUSED 값을 낮추고,

DELETE 작업이 많지 않고 읽기 작업이 많을 경우 PCTUSED 값을 높여서 설정하는 것이 좋다.

https://m.blog.naver.com/itperson/220879812591

 

[Oracle] 데이터 블록 설정옵션 (PCTFREE, PCTUSED 등) 이해하기

오라클 데이터베이스 논리적 저장 구조 이해하기 포스팅에서 데이터 블록에 대해서 간략히 다루었었다. 오...

blog.naver.com

 

ROW MIGRATION

UPDATE할 때 늘어나는 데이터를 저장할 공간이 없어서 다른 블럭으로 ROW를 옮기는 현상

기존 블록에 행 정보(row header, 블럭 주소값)만 두고, 새로운 블록에 실제 데이터를 이동한다.

→ row의 정보를 검색하기 위해 원래 블럭에서 주소를 먼저 읽고, 그 후 다른 블록을 찾아야 하므로 성능이 감소한다.

  • 해결 방법

PCTFREE 값을 충분히 할당하면, UPDATE할 때 공간이 부족하지 않아 ROW MIGRATION 발생 빈도가 줄어든다.

→ PCTFREE가 너무 클 경우 데이터 저장 공간 부족으로 공간 효율성이 감소하는 것을 고려해야 한다.

 
 

ROW CHAINING

하나의 row를 하나의 블럭에 저장할 수 없어서 여러 블럭에 걸쳐 저장하는 현상

새로운 로우 데이터가 입력되면 빈 공간이 존재하는 블록에 데이터가 입력되고, 공간부족 현상이 발생되면 나머지 데이터가 새로운 블록에 입력된다.

→ row의 정보를 검색하기 위해 하나 이상의 데이터 블럭을 스캔해야 하기 때문에 성능이 감소한다.

  • 해결 방법

데이터 블록 사이즈 (db_block_size) 를 크게 한다.

→ 그러나 사이즈 변경이 어렵고, 무조건 크게할 수도 없다.

→ 테이블의 한 로우에 들어가는 컬럼의 수나, 컬럼당 데이터 크기를 줄이고, 압축된 형태의 데이터를 넣는 방법 등 다른 형태의 해결책을 마련해보도록 해야 한다.

728x90

'Dev > Oracle' 카테고리의 다른 글

[Oracle] Oracle Lock Test  (0) 2022.06.10
[Oracle] HWM (High Water Mark)  (0) 2022.06.09
[Oracle] 사용자, 권한, 롤  (0) 2022.06.08
[Oracle] 아카이브 모드, 리두로그  (0) 2022.06.07
[Oracle] DECODE, CASE  (0) 2022.06.06

댓글