오라클에서 블록의 단편화 해결 방법 3가지
블록의 단편화 해결 방안
이중에서 두번째 방법인 테이블 move편 입니다
1) 데이터 삭제
DELETE FROM employees WHERE department_id = 10;
COMMIT;
2) 테이블 MOVE(오라클 8i (8.1.5) 이상) : 테이블을 물리적 재배치
ALTER TABLE employees MOVE;
ALTER TABLE ... MOVE 명령은 오라클 8i (8.1.5) 버전부터 사용할 수 있습니다.
이 명령은 테이블을 이동하여 블록 단편화를 줄이고 테이블의 물리적 구조를 최적화하는 데 사용됩니다.
* 파티션 테이블 이동 :
테이블이 파티션 되어 있다면! 파티션 단위로 이동 가능합니다(오라클 8i (8.1.5) 이상)
ALTER TABLE 테이블명 MOVE PARTITION 파티션명;
* 온라인 이동 :
데이터베이스가 가동 중인 동안에도 작업을 수행 가능(오라클 12c (12.1) 이상)
ALTER TABLE 테이블명 MOVE ONLINE;
* 특정 테이블스페이스로 테이블 이동 :
ALTER TABLE employees MOVE TABLESPACE new_tablespace_name;
3) 인덱스 리스트 조회
SELECT 'ALTER INDEX ' || index_name || ' REBUILD;'
FROM user_indexes
WHERE table_name = 'EMPLOYEES';
4) 인덱스를 재구성 명령어 실행(해당 테이블의 인덱스 모두를 REBUILD)
ALTER INDEX emp_name_idx REBUILD;
테이블을 MOVE한 후에는 해당 테이블에 연결된 인덱스가 UNUSABLE 상태가 됩니다.
따라서 인덱스를 재구성해야 합니다.
5) 통계정보 갱신(옵션)
SQL> exec dbms_stats.gather_table_stats('EMPLOYEES', cascade=>true)
[ 변화 및 효과 ]
1. 블록 단편화 해결
- 테이블을 MOVE하면 블록 단편화가 줄어들고, 테이블의 물리적 구조가 최적화 됩니다 -> 테이블 성능 향상
2. 행이동
- 테이블의 모든 행이 새로운 위치로 이동합니다
- 기존 행의 ROWID가 변경 됩니다
3. 공간 재사용
- MOVE 작업 후 원래 테이블 공간의 빈 블록이 다시 사용 가능합니다
[ 제약 사항 및 고려 사항]
1. 인덱스 상태
- 테이블 MOVE 후 해당 테이블에 연결된 인덱스는 UNUABLE 상태가 됩니다
- 인덱스 재구성(REBUILD) 해야 합니다
2. ROWID 변경
- ROWID를 사용하는 애플리케이션이 있으면 수정해야 할 수 있습니다
3. 테이블 LOCK
- 테이블에 락을 걸어 다른 작업을 중단 시킵니다
- ALTER TABLE ... MOVE ONLINE을 사용하면 락 문제를 완화할수 있지만
오라클 12C 이상에서만 가능합니다
4. 가용성
- MOVE하는 동안 해당 테이블에 대한 DML 작업이 불가능합니다
- 온라인 이동을 사용하면 테이블 가용성을 유지할 수 있습니다
5. 권한 및 제한
- 테이블을 MOVE 하려면 해당 테이블에 대한 ALTER 권한이 필요합니다