오늘은 Truncate와 Partition에 대해 공부해 보려고 한다.
이번 프로젝트에서 Truncate와 Partition을 사용할 일이 생겨서
Truncate가 왜 Delete보다 빠른지, Partition은 어떤 구조로 이루어졌는지에 대한 궁금증이 생겨서
이에 대해 조사해 보았다.
Delete와 Truncate
Delete와 Truncate는 둘다 데이터를 삭제한다는 기능을 가지고 있지만
동작방식은 살짝 다른데, 이에 대해 이해하기 위해서는 RDBMS의 저장 구조를 알면 좋을거 같다.
RDBMS의 논리적 저장구조

RDBMS는 Table Space, Segment, Extent, Block으로 구성되어 있다.
Block (Page)

Block은 디스크와 메모리 간 I/O 처리를 위한 최소 단위 이다.
Block은 여러개의 row들로 이루어져있고
8Kb 또는 15Kb의 크기를 가진다.
RDBMS에서 하나의 row를 조회해도
해당 row가 있는 블럭 전체를 메모리로 읽어온다.
블럭은 header, 데이터, 슬롯 배역, 여유공간(Free Space)으로 이루어져 있다.
Extent (익스텐트)

Extent는 블럭들의 집합으로 보통 1 Mb의 크기를 가진다.
Extent는 디스크 파편화를 방지하기 위해 만들어졌는데
블럭이 늘어날 때마다 별도의 공간에 신규 블럭을 생성하면 디스크 파편화가 발생하기 때문에
이를 방지하기 위해 미리 블럭의 덩어리를 할당해두는 것이다.
Segment (세그먼트)

Segment는 익스텐트의 집합으로
테이블, 인덱스 등 단일 데이터베이스 객체의 저장소이다.
Segment의 크기는 가변적으로
테이블 하나를 위해 데이터 저장을 위한 Data Segment와
인덱스 저장을 위한 Index Segment로 각각 독립적으로 저장된다.
Delete와 Truncate의 차이
Detele는 블럭에서 행의 데이터를 삭제하는 개념이고
Truncate는 Page의 공간 할당을 취소하는 개념이다.
DELETE
Delete는 조건에 해당하는 데이터를 삭제하는 작업을 한다.
-- 1. 특정 조건의 행만 삭제
DELETE FROM employees
WHERE department_id = 10;
-- 2. 전체 행 삭제
DELETE FROM employees;
TRUNCATE
Truncate는 테이블 또는 테이블의 지정된 파티션에서 모든 행을 제거한다.
TRUNCATE TABLE employees;
TRUNCATE TABLE 는 WHERE절이 DELETE 문과 결과는 동일하다.
Truncate table은 테이블과 인덱스 데이터를 저장하는 데 사용하는
데이터 블럭을 할당 취소하는 행위이다.
Truncate와 Delete 비교
Delete로 전체 데이터를 삭제하는 것과 Truncate를 하는 것은 결과적으로 동일한 결과를 갖게 되지만
내부적으로 실행하는 로직은 전혀 다르다.
Delete는 삭제할 행에 대해 Lock을 발생시키고
행 하나씩 삭제하면서 삭제한 행을 트랜잭션 로그에 기록하여 rollBack 가능하도록 한다.

또한 Delete는 삭제할 행(블럭 내부 메모리)의 데이터를 삭제하기 때문에
블럭 자체의 빈 공간이 남게된다.
Truncate table은 내부적으로 테이블과 인덱스 데이터를 저장하는 데 사용하는
데이터 블럭을 할당 취소한다.

만약 위와 같이 데이터가 할당되어있다면
Truncate를 실행시키면 Extent와 연결된 block 데이터를 할당 취소하는 것이다.

Truncate는 Delete보다 빠르고 효율적인데
각 행에 대한 삭제 Log를 남기는 Delete와는 달리 Truncate는 블럭에 대한 할당 취소 조그만 남긴다.
또한, Delete를 사용하면 테이블의 삭제해야 하는 각 행을 잠그지만
Truncte table은 테이블, 페이지에 대한 잠금이 있을 뿐 각 행을 잠그지 않는다.
때문에 전체 삭제가 필요한 경우 Truncate 사용 시 더 빠르고 효율적이다.
오늘은 Delete, Truncate에 대해 알아보았다.
다음에는 Database Cursor의 구조에 대해 알아보고 싶다.
참고 사이트
https://da-new.tistory.com/m/93
'전공공부' 카테고리의 다른 글
| [Database] 인덱스(Index)란 무엇인가? : B+Index의 구조 (0) | 2026.07.24 |
|---|---|
| DB PK(유일값) 일련번호 채번방식에 대하여 (0) | 2026.07.05 |
| [Spring Batch] Batch에서의 Tasklet과 Chunk (0) | 2026.06.13 |
| Oracle Join이란 무엇인가? : Outer Join에서 (+)가 없다면? (0) | 2026.05.31 |
| Stateful과 Stateless는 무엇인가? (1) | 2026.05.05 |