ORACLE 데이터 삭제 용량 예측

안녕하세요, Surmin입니다! 😊

오라클 데이터베이스에서 데이터 삭제는 데이터 관리의 중요한 부분입니다. 데이터베이스의 성능과 효율성을 유지하기 위해서는 적절한 데이터 삭제가 필수적이죠.

그래서 이번 글에서는 데이터 삭제 용량을 대략적으로 예측할 수 있는 방법을 소개해 드리겠습니다. 많은 도움이 되길 바라며, 참고 부탁드립니다!

계산식

  • 지워질(가로)/조회될(세로) 데이터 양 : 전체 데이터 양 = 지워질/조회될 크기 : 전체 크기

Test

CREATE TABLE test_size (
    id NUMBER,
    name VARCHAR2(1000),
    description VARCHAR2(2000)
);

# 테스트 데이터 대량 삽입
BEGIN
    FOR i IN 1..100000 LOOP
        INSERT INTO test_size VALUES (
            i,
            RPAD('Name' || i, 1000, '*'),
            RPAD('Description' || i, 2000, '#')
        );
        IF MOD(i, 10000) = 0 THEN
            COMMIT;
        END IF;
    END LOOP;
    COMMIT;
END;
/
  • 생성한 테이블 전체 크기확인 합니다.
SELECT SEGMENT_NAME, 
       SUM(BYTES)/1024/1024 AS MB
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'TEST_SIZE'
  AND OWNER = USER    #다른 계정으로 할경우 ex) 'HR' 
GROUP BY SEGMENT_NAME;

SEGMENT_NAME  |   MB
---------------|-------
TEST_SIZE     |  392
  • 전체 건수와 조건에 맞는 건수 확인 합니다.
-- 전체 건수
SELECT COUNT(*) as total_rows FROM test_size;  
TOTAL_ROWS
----------
    100000

-- 조건 건수
SELECT COUNT(*) as filtered_rows FROM test_size WHERE id <= 10000;  
FILTERED_ROWS
-------------
        10000
  • 비례식 검증 적용(가설)
10,000 : 100,000 = X : 392MB
X = (10,000 * 392) / 100,000 = 39.2MB
  • 실제로 확인 Test
    • 거의 정확하게 일치하는 것을 확인하였습니다.
    • 현업에서는 데이터가 실시간으로 delete,insert 됨으로 참고용이지, 딱맞아 떨어지는건 아니다. (delete 같은 경우 Extents영역까지 해제하는것은 아니기때문에 공간이 줄어들지는 않음)
      • 그래서 rebuild , Shrink 를 수행합니다.
CREATE TABLE test_size_small
AS SELECT * FROM test_size WHERE id <= 10000;

SELECT SEGMENT_NAME, 
       SUM(BYTES)/1024/1024 AS MB
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'TEST_SIZE_SMALL'
  AND OWNER = USER
GROUP BY SEGMENT_NAME;

SEGMENT_NAME      |  MB
------------------|-----
TEST_SIZE_SMALL   |  40

위로 스크롤