본문 바로가기
Database/Oracle

[ORACLE] TRUNCATE() 완전 정복 : DELETE와의 차이점부터 실전 예제까지

by Papa Martino V 2025. 6. 11.
728x90

 

오라클 TRUNCATE() 완전 정복: DELETE와의 차이점부터 실전 예제까지
[Oracle] TRUNCATE

 

Oracle에서 TRUNCATE는 테이블의 모든 데이터를 빠르게 삭제하는 강력한 명령어입니다. 표면적으로는 DELETE와 비슷하지만 내부적으로는 전혀 다른 방식으로 작동하며, 성능에 미치는 영향도 큽니다. 본 글에서는 TRUNCATE의 특징, 사용 예제, 성능적 장점, 그리고 자주 혼동되는 DELETE와의 차이점까지, 개발자 입장에서 실무에서 바로 활용할 수 있도록 정리하였습니다.


1. TRUNCATE란 무엇인가?

TRUNCATE는 Oracle SQL에서 테이블의 모든 레코드를 제거하는 DDL (Data Definition Language) 명령입니다. 이는 테이블을 초기화하고자 할 때 주로 사용되며, 일반적으로 DELETE보다 훨씬 빠릅니다.

TRUNCATE TABLE 테이블명;

예를 들어, 고객 테이블의 모든 데이터를 삭제하려면 다음과 같이 작성합니다:

TRUNCATE TABLE CUSTOMER;

이 명령은 롤백이 불가능하며, 테이블 구조는 유지되지만 데이터는 완전히 제거됩니다.


2. TRUNCATE의 주요 특징

  • 빠름: DELETE보다 훨씬 빠름 (Redolog, Undo 최소 생성)
  • 롤백 불가: COMMIT 없이도 즉시 반영되고, ROLLBACK 불가
  • 시퀀스 영향 없음: AUTO_INCREMENT 또는 SEQUENCE 값은 초기화되지 않음
  • 제약 조건 무시: 외래 키(FK)가 있는 경우 사용 불가 (제약조건 활성화 시)
  • 트리거 미호출: DELETE 트리거가 있어도 작동하지 않음

3. TRUNCATE와 DELETE의 차이점

항목 DELETE TRUNCATE
언어 유형 DML (Data Manipulation Language) DDL (Data Definition Language)
WHERE 조건 사용 가능 불가능 (전체 삭제만 가능)
롤백 가능 (트랜잭션 처리) 불가능 (즉시 적용)
트리거 호출 호출됨 호출 안 됨
속도 느림 (레코드 단위 삭제) 빠름 (데이터 블록 초기화)

4. TRUNCATE 사용 예제

예제 1: 단순 테이블 데이터 삭제

TRUNCATE TABLE TEMP_LOG;

이 명령은 TEMP_LOG 테이블의 모든 데이터를 영구적으로 삭제합니다.

예제 2: 파티션 테이블 일부만 삭제 (Oracle 12c+)

TRUNCATE TABLE SALES PARTITION Q1_2024;

특정 파티션만 제거하고 나머지는 유지할 수 있습니다. 이는 대용량 테이블에서 유용합니다.

예제 3: CASCADE 옵션 사용

TRUNCATE TABLE ORDER_LIST CASCADE;

하위 테이블도 함께 삭제하려면 CASCADE 옵션을 사용합니다. 주의해서 사용해야 합니다.


5. TRUNCATE 사용 시 주의사항

1. 외래 키 제약조건 존재 시 사용 불가

외래 키(Foreign Key) 제약조건이 활성화된 테이블은 TRUNCATE가 불가능합니다.

ORA-02266: unique/primary keys in table referenced by enabled foreign keys

이 경우, 제약조건을 DISABLE 한 후 TRUNCATE를 수행해야 합니다.


ALTER TABLE 자식테이블 DISABLE CONSTRAINT fk_제약조건명;
TRUNCATE TABLE 부모테이블;
ALTER TABLE 자식테이블 ENABLE CONSTRAINT fk_제약조건명;

2. 트리거 사용 불가

DELETE에서는 작동하는 트리거가 TRUNCATE에서는 무시됩니다. 데이터 삭제 로직이 트리거에 의존할 경우 사용을 피해야 합니다.

3. 롤백 불가

TRUNCATE는 COMMIT과 무관하게 즉시 반영되므로, 실수로 수행하면 복구가 어렵습니다.


6. 성능 비교: DELETE vs TRUNCATE

같은 양의 데이터를 삭제할 때, TRUNCATE는 DELETE보다 월등히 빠르며 리소스 소모가 적습니다.


-- 100만 건 삭제 예제
-- DELETE
DELETE FROM BIG_TABLE;
-- 평균 수행 시간: 45초, REDO 및 UNDO 공간 많이 소모

-- TRUNCATE
TRUNCATE TABLE BIG_TABLE;
-- 평균 수행 시간: 2초, 최소한의 로그 기록

대량의 데이터 초기화가 필요할 때는 TRUNCATE가 권장됩니다.


7. 실무 적용 예시

로그 테이블 주기적 초기화


BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE API_LOG';
END;

테스트 데이터 초기화


TRUNCATE TABLE DEV_USERS;
TRUNCATE TABLE DEV_ORDERS;

개발 환경에서 반복 테스트 시 유용하게 사용됩니다.


8. 결론

Oracle의 TRUNCATE 명령은 데이터 삭제를 빠르고 효율적으로 처리할 수 있는 강력한 도구입니다. 하지만 롤백 불가, 제약조건 제한 등 주의할 점도 많기 때문에 실무에서는 반드시 용도와 상황을 고려해 신중히 사용해야 합니다. DELETE와의 차이를 명확히 이해하고, 실제 운영 환경에서 적절히 활용하는 것이 중요합니다.


📚 참고자료

728x90