현상
Extent Allocation을 autoalloc으로 설정한 상태에서 데이터의 추가와 drop/truncate 작업이 반복될 경우, 데이터 파일 내 공간이 점점 단편화되는 문제가 발생할 수 있습니다.
이러한 단편화로 인해 시간이 지남에 따라 점점 더 큰 extent를 할당받기 어려워지고, 시스템은 점점 더 작은 extent로 줄여가며 재시도하게 됩니다. 이 과정에서 성능 저하가 발생할 수 있습니다.
예를 들어, 거래 로그를 저장하고 주기적으로 삭제하는 업무 등에서 이러한 문제가 나타날 수 있습니다.
원인
1.
extent 할당 방식이 autoalloc으로 설정되어 있는 경우 (기본값)
2.
주기적으로 segment의 create/insert와 drop/truncate가 반복되는 경우
이 때 autoalloc 방식으로 할당된 작은 크기의 extent들이 공간 내에 조각나게 되며, 이러한 단편화가 점진적으로 누적되어 문제를 유발합니다.
참고
•
truncate나 drop이 거의 발생하지 않고, 한 번 만들어진 segment를 계속 확장하면서 사용하는 경우에는 해당 문제가 발생하지 않습니다.
•
실제로 undo tablespace에서도 동일한 문제가 발생한 바 있으며, 이에 따라 undo segment의 할당 방식을 uniform으로 강제하도록 변경한 이력이 있습니다.
해결
사전 예방
•
해당 업무가 단편화를 유발할 가능성이 있는 경우, 초기부터 tablespace의 extent management를 uniform 64M 등으로 설정하시는 것을 권장드립니다.
•
또는 uniform으로 설정한 별도의 tablespace를 신규로 생성한 후, 점진적으로 이관하는 방식도 고려할 수 있습니다.
사후 조치
•
이미 단편화가 진행된 이후에는, 전체 데이터를 drop하고 새로 부어넣는 방법 외에는 적절한 해결 방법이 없습니다.
참고
진단 방법
•
APM에서 instance activity (time based) 항목을 확인했을 때, sgmt alloc ext time이 insert time 대비 2~30% 이상, 많게는 90% 이상을 차지하는 경우
•
select * from dba_free_space; 조회 시, row 수가 많고 각 row의 block count, size bytes가 작을 때 (대부분 16 block, 128K)
•
S1427 버전 이후부터는 APM > instance activity (time based)에서 sgmt alloc ext from datafile의 비율이 높고 (2~30%, 많게는 90% 이상), alloc fail count 값이 num (datafile을 돌며 할당 수행한 횟수)과 근접한 경우