| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- CREATE OR REPLACE PROCEDURE SHRINK_TABLE_AND_REPORT(p_table_name IN VARCHAR2) IS
- v_pre_size_mb NUMBER;
- v_post_size_mb NUMBER;
- v_saved_mb NUMBER;
- BEGIN
- -- 리로그 전 사이즈 측정
- SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2)
- INTO v_pre_size_mb
- FROM USER_SEGMENTS
- WHERE SEGMENT_NAME = UPPER(p_table_name)
- AND SEGMENT_TYPE = 'TABLE';
- DBMS_OUTPUT.PUT_LINE('리로그 전 사이즈: ' || v_pre_size_mb || ' MB');
- -- 행 이동 허용 설정
- EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ENABLE ROW MOVEMENT';
- -- SHRINK SPACE 실행
- EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' SHRINK SPACE';
- -- 행 이동 설정 복구
- EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' DISABLE ROW MOVEMENT';
- -- 리로그 후 사이즈 측정
- SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2)
- INTO v_post_size_mb
- FROM USER_SEGMENTS
- WHERE SEGMENT_NAME = UPPER(p_table_name)
- AND SEGMENT_TYPE = 'TABLE';
- DBMS_OUTPUT.PUT_LINE('📉 리로그 후 사이즈: ' || v_post_size_mb || ' MB');
- -- 절감된 공간 계산
- v_saved_mb := v_pre_size_mb - v_post_size_mb;
- DBMS_OUTPUT.PUT_LINE('절감된 공간: ' || ROUND(v_saved_mb, 2) || ' MB');
- EXCEPTION
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('오류 발생: ' || SQLERRM);
- END;
- /
|