Shrink.SQL 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. CREATE OR REPLACE PROCEDURE SHRINK_TABLE_AND_REPORT(p_table_name IN VARCHAR2) IS
  2. v_pre_size_mb NUMBER;
  3. v_post_size_mb NUMBER;
  4. v_saved_mb NUMBER;
  5. BEGIN
  6. -- 리로그 전 사이즈 측정
  7. SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2)
  8. INTO v_pre_size_mb
  9. FROM USER_SEGMENTS
  10. WHERE SEGMENT_NAME = UPPER(p_table_name)
  11. AND SEGMENT_TYPE = 'TABLE';
  12. DBMS_OUTPUT.PUT_LINE('리로그 전 사이즈: ' || v_pre_size_mb || ' MB');
  13. -- 행 이동 허용 설정
  14. EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ENABLE ROW MOVEMENT';
  15. -- SHRINK SPACE 실행
  16. EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' SHRINK SPACE';
  17. -- 행 이동 설정 복구
  18. EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' DISABLE ROW MOVEMENT';
  19. -- 리로그 후 사이즈 측정
  20. SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2)
  21. INTO v_post_size_mb
  22. FROM USER_SEGMENTS
  23. WHERE SEGMENT_NAME = UPPER(p_table_name)
  24. AND SEGMENT_TYPE = 'TABLE';
  25. DBMS_OUTPUT.PUT_LINE('📉 리로그 후 사이즈: ' || v_post_size_mb || ' MB');
  26. -- 절감된 공간 계산
  27. v_saved_mb := v_pre_size_mb - v_post_size_mb;
  28. DBMS_OUTPUT.PUT_LINE('절감된 공간: ' || ROUND(v_saved_mb, 2) || ' MB');
  29. EXCEPTION
  30. WHEN OTHERS THEN
  31. DBMS_OUTPUT.PUT_LINE('오류 발생: ' || SQLERRM);
  32. END;
  33. /