안녕하세요, 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