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 이하의 값이 될때까지 새로운 데이터를 추가하지 않는다.
PCTFREE = 10%, PCTUSED = 40%인 데이터블록이다.
기존에 20% 정도를 차지하고 있던 ROW DATA가 [그림 1] 점점 쌓여 90%까지 데이터 공간을 모두 차지하였다. 남아있는 FREE SPACE = PCTFREE 값이 되었다. [그림 2]
이 때는 오라클에서 더 이상 이 데이터 블록에 데이터를 저장하지 않는다.
그런데 필요없는 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
ROW MIGRATION
UPDATE할 때 늘어나는 데이터를 저장할 공간이 없어서 다른 블럭으로 ROW를 옮기는 현상
기존 블록에 행 정보(row header, 블럭 주소값)만 두고, 새로운 블록에 실제 데이터를 이동한다.
→ row의 정보를 검색하기 위해 원래 블럭에서 주소를 먼저 읽고, 그 후 다른 블록을 찾아야 하므로 성능이 감소한다.
- 해결 방법
PCTFREE 값을 충분히 할당하면, UPDATE할 때 공간이 부족하지 않아 ROW MIGRATION 발생 빈도가 줄어든다.
→ PCTFREE가 너무 클 경우 데이터 저장 공간 부족으로 공간 효율성이 감소하는 것을 고려해야 한다.
ROW CHAINING
하나의 row를 하나의 블럭에 저장할 수 없어서 여러 블럭에 걸쳐 저장하는 현상
새로운 로우 데이터가 입력되면 빈 공간이 존재하는 블록에 데이터가 입력되고, 공간부족 현상이 발생되면 나머지 데이터가 새로운 블록에 입력된다.
→ row의 정보를 검색하기 위해 하나 이상의 데이터 블럭을 스캔해야 하기 때문에 성능이 감소한다.
- 해결 방법
데이터 블록 사이즈 (db_block_size) 를 크게 한다.
→ 그러나 사이즈 변경이 어렵고, 무조건 크게할 수도 없다.
→ 테이블의 한 로우에 들어가는 컬럼의 수나, 컬럼당 데이터 크기를 줄이고, 압축된 형태의 데이터를 넣는 방법 등 다른 형태의 해결책을 마련해보도록 해야 한다.
'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 |
댓글