반응형
🧠 1. SHRINK란 무엇인가?
Oracle의 SHRINK SPACE 기능은 세그먼트(테이블, 인덱스 등)에 할당된 여유 공간을 줄이는 작업입니다. 특히 DML(INSERT/DELETE 등) 작업이 많은 OLTP 환경에서 불필요하게 커진 테이블의 공간을 줄이고 I/O 성능을 향상시킬 수 있는 유용한 방법입니다.
🏗️ 2. 동작 원리
- DELETE 작업은 데이터를 지워도 실제 테이블 크기는 줄어들지 않습니다.
- SHRINK은 내부적으로 데이터를 재정렬하고 HWM(High Water Mark) 아래로 데이터를 밀어 넣은 후, 불필요한 블록을 반환합니다.
- 반환된 블록은 tablespace에 반환되어 다른 객체에서 재사용 가능해집니다.
⚙️ 3. SHRINK 사용 조건
| 조건 | 설명 |
| ASSM(Automatic Segment Space Management) 사용 |
SHRINK는 ASSM이 설정된 tablespace에서만 사용 가능 |
| ROW MOVEMENT 허용 | 테이블에서 행이 재배치되므로, ROW MOVEMENT를 ENABLE 해야 함 |
| 테이블이 파티션이 아닐 경우 | 비파티션 테이블은 바로 shrink 가능 (파티션 테이블은 개별 파티션 단위 shrink 필요) |
💻 4. SHRINK 사용 예제
1) 준비: ROW MOVEMENT 활성화
ALTER TABLE employees ENABLE ROW MOVEMENT;
2) 테이블 SHRINK (압축 + 공간 반환)
ALTER TABLE employees SHRINK SPACE;
🔁 이 명령은 데이터를 재배치한 뒤 HWM을 낮추고 여유 공간을 반환합니다.
3) 단계적 SHRINK (단계적으로 작업할 경우)
ALTER TABLE employees SHRINK SPACE COMPACT; -- 재배치만 수행
ALTER TABLE employees SHRINK SPACE; -- HWM 낮추기 및 공간 반환
4) 인덱스 SHRINK
ALTER INDEX emp_name_idx SHRINK SPACE;
🚨 5. 주의사항
- SHRINK 중 잠금(Lock): Compact 단계는 공유 잠금, 전체 SHRINK는 일시적으로 Exclusive 잠금을 유발할 수 있습니다.
- ROWID 변경: SHRINK는 행 재배치를 수반하므로 ROWID가 변경됩니다. ROWID를 외부에서 참조하는 경우 주의!
- LOB 컬럼 SHRINK 불가: 일반 테이블은 가능하지만, LOB가 포함된 경우 일부 제한이 있습니다.
- 파티션 테이블: 각 파티션별로 별도로 SHRINK해야 합니다.
📊 6. SHRINK 전후 비교 예시
-- SHRINK 전 공간 확인
SELECT table_name, blocks FROM user_tables WHERE table_name = 'EMPLOYEES';
-- SHRINK 수행
ALTER TABLE employees ENABLE ROW MOVEMENT;
ALTER TABLE employees SHRINK SPACE;
-- SHRINK 후 공간 확인
SELECT table_name, blocks FROM user_tables WHERE table_name = 'EMPLOYEES';
🧩 7. 언제 SHRINK를 사용할까?
| 상황 | 권장 여부 |
| 대량 DELETE 후 공간이 비었을 때 | ✅ 적극 권장 |
| OLTP 시스템에서 빈번한 DML이 있는 테이블 | ✅ 주기적 SHRINK 고려 |
| ROWID를 외부에서 참조 중 | ❌ 비권장 |
| 운영 시스템에서 실시간 SHRINK | ⚠️ 부하 고려 필요 (테스트 후 적용 권장) |
📌 마무리
Oracle SHRINK는 공간 절감과 I/O 성능 개선에 직접적인 영향을 줄 수 있는 기능입니다. 하지만 모든 환경에 무작정 적용하기보다는 행 이동, 잠금, 성능 영향 등을 고려한 후 운영 정책에 맞게 주기적 또는 수동으로 적용하는 것이 좋습니다.
✅ 팁: 주기적인 SHRINK 작업은 배치나 야간 시간에 실행하고, 작업 전후 ROWID, 공간 블록 수, I/O 성능 지표 등을 반드시 비교해 보세요.
반응형
'IT > 오라클' 카테고리의 다른 글
| [오라클 SQL] 테이블별 용량 조회 및 테이블스페이스 사용량 확인 방법 (0) | 2025.06.30 |
|---|---|
| Oracle Undo Tablespace 급증 원인과 해결법: 트랜잭션 병목 방지 가이드 (0) | 2025.06.30 |
| 🔐 ORA-00054: 리소스 잠금 오류의 원인과 해결법 (0) | 2025.06.29 |
| ORA-14400: inserted partition key does not map to any partition (0) | 2025.06.29 |
| Oracle UNDO 테이블스페이스 용량 확인 및 부족 오류 해결 방법 총정리 (0) | 2025.06.28 |