테이블 데이터 전체삭제 DELETE, TRUNCATE, DROP 뭘 써야 할까?

테이블 데이터 전체삭제를 하는 방법중 DELETE, TRUNCATE, DROP를 비교한 블로그입니다.
2023.05.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 DA사업본부 송영진입니다. 오늘은 Amaz 테이블에서 전체 데이터를 삭제하는 방법에 대해 알아보도록 하겠습니다. 테이블에서 전체 데이터를 삭제하고 싶을 때가 자주 있으실 텐데요 다양한 방법들이 있는 만큼 어떤 방법이 좋은지 왜 좋은지 알아보도록 하겠습니다.

테이블에서 데이터 삭제하기

대표적으로 3가지 방법이 있습니다.

  1. DELETE FROM
  2. TRUNCATE TABLE
  3. DROP TABLE

하나하나 알아보도록 하겠습니다

DELETE로 데이터를 삭제하는 방법

DELETE FROM 테이블_이름;

테이블에서 조건을 붙여서 특정 데이터만 삭제하는 방법으로 자주 쓰이는 DELETE FROM은 WHERE를 사용하여 조건부 삭제를 할 수 있으며 물론 테이블 내의 전체 데이터를 모두 삭제 할 수 있습니다.

DELETE를 수행할 때 내부에서 삭제를 할 데이터를 확보하기 위해 탐색하는 과정을 거치며, 삭제할 대상을 확인 후 삭제가 이루어집니다.

TRUNCATE로 데이터를 삭제하는 방법

TRUNCATE TABLE 테이블_이름;

테이블 안의 모든 데이터를 삭제하며, DELETE FROM과 다르게 삭제할 대상을 내부에서 SELECT하지 않기 때문에 빠릅니다.

지난 블로그 Amazon Redshift에서 TRUNCATE를 실행했을 때, must be owner of relation 에러가 날 경우 대처법 에서 잠깐 다룬 부분이지만, TRUNCATE를 수행하기 위해서는 실행하는 유저가 테이블의 소유권을 갖고 있거나, 슈퍼유저여야 TRUNCATE 명령을 할 수 있습니다.

DROP으로 데이터를 삭제하는 방법

DROP TABLE 테이블_이름;

테이블 그 자체를 삭제하는 방법입니다. 테이블 내의 데이터 뿐만 아니라 테이블의 정의까지 사라지게 됩니다. 테이블이 더 이상 쓸모가 없기 때문에 데이터베이스 내부에 테이블을 지우기 위해서 사용하거나, 테이블의 정의가 잘못되어서 다시 작성을 하기 위해 삭제하는 경우가 있습니다.

매번 테이블을 삭제할 필요가 있으면 다음과 같이 테이블을 생성할 때 임시테이블로 생성하는 것도 하나의 방법입니다.

CREATE TEMP TABLE 테이블_이름 (칼럼1 VARCHAR);

위의 테이블은 세션이 종료될 때 자동으로 삭제가 되는 테이블입니다.

마지막으로

주로 데이터웨어하우스의 마스터 테이블을 갱신하게 될 때 이러한 테이블 내부의 데이터를 전부 삭제하는 작업이 필요하게 되는데요, 갱신하는 부분은 보통 배치작업으로 이루어집니다. 저도 Glue나 Lambda로 자동으로 Redshift에 SQL을 실행해서 갱신 작업을 하고 있습니다.

이럴 때 데이터를 어떻게 삭제해야하나 고민을 하곤 하는데요, 가장 빠른건 역시 TRUNCATE입니다. 하지만 TRUNCATE를 하기 위해서는 위에서 다루었듯이 SQL을 실행하는 유저가 테이블의 소유자거나 슈퍼유저여야합니다. 배치작업을 할 때에는 소스코드의 수정이 있을 수 있으니 SQL을 실행하는 유저에게 적은 권한을 갖게 하는게 안전하겠죠 그래서 DELETE를 써야할까 고민을 하다가도 결국 DELETE도 테이블 전체를 지울 수 있으니까 그게 그거 아닌가? 하고 고민을 할 때가 있습니다. ㅋㅋㅋㅋ

마지막의 테이블 자체를 지워버리는 방법은 임시로 보관하기 위한 테이블이 필요할 때 주로 사용하는데요, 저는 이 부분도 배치작업에서 실패해버렸을 때 임시 테이블도 같이 삭제되어버리기 때문에 테이블을 만들어두고 TRUNCATE하는 방법으로 임시테이블을 확인하곤 합니다. 물론 아예 임시테이블을 확실히 안봐도 괜찮다! 하는 경우에는 TEMP로 테이블을 생성하여 세션이 종료되면 사라지게 하는게 더욱 테이블 관리가 심플해집니다.

이러한 방법들이 있으니 상황에 맞게 사용하실 수 있다면 좋겠습니다. 감사합니다!