drop table과 truncate table의 차이점은 무엇입니까?


80

보고서 롤업의 일부로 작성하는 테이블이 있습니다. 나중에는 전혀 필요하지 않습니다. 누군가가 더 빠르기 때문에 자르라고 언급했습니다.



테이블을 자르면 MySQL은 하드 디스크의 공간을 확보하지 않습니다. 스토리지를 되돌리려면 테이블을 자르지 말고 삭제해야합니다.
Emilio Nicolás 2014

답변:


102

테이블에서 레코드를 삭제하면 모든 삭제가 기록되고 삭제 된 레코드에 대해 삭제 트리거가 실행됩니다. Truncate는 각 행을 로깅하지 않고 테이블을 비우는보다 강력한 명령입니다. SQL Server는 각 행의 외래 키를 확인해야하기 때문에 테이블을 참조하는 외래 키가있는 테이블을 자르지 못하게합니다.

Truncate는 일반적으로 초고속이며 임시 테이블에서 데이터를 정리하는 데 이상적입니다. 나중에 사용할 수 있도록 테이블의 구조를 보존합니다.

테이블 정의 와 데이터 를 실제로 제거하려면 테이블을 삭제하면 됩니다.

자세한 내용은 이 MSDN 문서 를 참조하십시오.


4
또한 테이블을 자르면 ID 시드가 재설정됩니다. 테이블을 자르고 데이터를 삽입 할 수 있으며 매번 ID 값이 무엇인지 알 수 있으므로 테스트에 유용 할 수 있습니다. 테이블의 모든 데이터를 삭제했다면 그렇게 할 수 있습니다.
Jim


87

DROP TABLE은 테이블을 삭제합니다.

TRUNCATE TABLE은이를 비우지 만 향후 데이터를 위해 구조를 그대로 둡니다.


4
Man, 당신이 아는 것보다 더 많은 것이 있습니다;)
David Aldridge

21
이것이 주요 차이점입니다.
ceejayoz

26

DROP과 TRUNC는 다른 일을합니다.

테이블 자르기

개별 행 삭제를 기록하지 않고 테이블에서 모든 행을 제거합니다. TRUNCATE TABLE은 WHERE 절이없는 DELETE 문과 유사합니다. 그러나 TRUNCATE TABLE은 더 빠르고 시스템 및 트랜잭션 로그 리소스를 더 적게 사용합니다.

드롭 테이블

하나 이상의 테이블 정의와 해당 테이블에 대한 모든 데이터, 인덱스, 트리거, 제약 조건 및 권한 사양을 제거합니다.

속도에 관한 한 차이는 작아야합니다. 어쨌든 테이블 구조가 전혀 필요하지 않다면 반드시 DROP을 사용하십시오.


20

DELETE TABLE과 TRUNCATE TABLE의 차이점을 의미한다고 생각합니다.

드롭 테이블

데이터베이스에서 테이블을 제거하십시오.

표 삭제

조건없이 모든 행을 삭제합니다. 트리거와 참조가 있으면 모든 행에 대해 처리됩니다. 또한 인덱스가 있으면 수정됩니다.

테이블 자르기

행 개수를 0으로 설정하고 각 행을 로깅하지 않습니다. 다른 둘 다만큼 더 빠릅니다.


4
set the row count zero실제로 ID 값을 초기 ID 시드 값으로 다시 설정합니다.
Filip De Vos 2011 년

10

이 답변 중 어느 것도이 두 작업에 대한 중요한 차이점을 지적하지 않습니다. 테이블 삭제는 롤백 할 수있는 작업입니다. 그러나 자르기는 롤백 할 수 없습니다 [ 'TRUNCATE TABLE'도 롤백 할 수 있습니다]. 이러한 방식으로 매우 큰 테이블을 삭제하는 것은 많은 행이있는 경우 매우 비용이 많이들 수 있습니다. 롤백하기로 결정한 경우 모두 임시 공간에 기록되어야하기 때문입니다.

일반적으로 큰 테이블을 제거하려면 테이블을 자른 다음 삭제합니다. 이렇게하면 데이터가 기록없이 제거되고 테이블이 삭제 될 수 있으며 데이터를 기록 할 필요가 없기 때문에 삭제 비용이 매우 저렴합니다.

자르기는 데이터를 삭제하고 테이블을 떠나는 반면, 드롭은 실제로 데이터와 테이블 자체를 삭제한다는 점을 지적하는 것이 중요합니다. (외래 키가 그러한 작업을 배제하지 않는다고 가정)


2
이것은 완전히 정확하지 않습니다. TRUNCATE는 "트랜잭션 로그 복원"의미가 아니라 BEGIN TRANSACTION, TRUNCATE TABLE, ROLLBACK 의미에서 롤백 될 수 있습니다. 페이지 할당 해제를 기록합니다.
Mark Sowul 2011

1
-1 DROP은 기본적으로 TRUNCATE시스템 테이블에서 테이블 메타 데이터를 삭제 한 다음에 이어집니다. 여기에서이 질문을보십시오
Martin Smith

5

DROP 테이블

DROP TABLE [table_name];

DROP 명령은 데이터베이스에서 테이블을 제거하는 데 사용됩니다. DDL 명령입니다. 테이블의 모든 행, 인덱스 및 권한도 제거됩니다. DROP 작업은 롤백 할 수 없습니다.

테이블 삭제

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

DELETE 명령은 DML 명령입니다. WHERE 절에 지정된 조건에 따라 테이블에서 모든 행 또는 일부 행을 삭제하는 데 사용할 수 있습니다. 행 잠금을 사용하여 실행되며 테이블의 각 행은 삭제를 위해 잠 깁니다. 트랜잭션 로그를 유지하므로 TRUNCATE보다 느립니다. DELETE 작업은 롤백 할 수 있습니다.

TRUNCATE 테이블

TRUNCATE TABLE [table_name];

TRUNCATE 명령은 테이블에서 모든 행을 제거합니다. 각 행의 삭제를 기록하지 않고 테이블의 데이터 페이지 할당 취소를 기록하므로 DELETE보다 빠릅니다. 테이블 잠금을 사용하여 실행되며 모든 레코드를 제거하기 위해 전체 테이블이 잠 깁니다. DDL 명령입니다. TRUNCATE 작업은 롤백 할 수 없습니다.


이것은 정확하지 않습니다. 잘라 내기 및 삭제는 롤백 할 수 있습니다. CREATE TABLE dbo.TestTruncate (ID INT) INSERT INTO dbo.TestTruncate (ID) VALUES (1) INSERT INTO dbo.TestTruncate (ID) VALUES (2) INSERT INTO dbo.TestTruncate (ID) VALUES (3) BEGIN TRAN TRUNCATE TABLE dbo .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
InbetweenWeekends

4

TRUNCATE TABLE은 모든 이전 인덱싱 및 기타 사항을 유지합니다. DROP TABLE은 분명히 테이블을 제거하고 나중에 다시 만들어야합니다.


3

Drop은 테이블을 완전히 제거하고 정의도 제거합니다. Truncate는 테이블을 비우지 만 정의를 제거하지는 않습니다.


3

테이블을 자르면 테이블이 비워집니다. 테이블을 삭제하면 완전히 삭제됩니다. 둘 중 하나는 빠르지 만 삭제하는 것이 더 빠를 것입니다 (데이터베이스 엔진에 따라 다름).

더 이상 필요하지 않은 경우 스키마를 복잡하게하지 않도록 삭제하십시오.


3

TRUNCATE TableA 대신 TableA를 삭제 하시겠습니까? 일반적인 오해는 그들이 같은 일을한다는 것입니다. 별로. 사실 둘 사이에는 많은 차이점이 있습니다.

DELETE는 행별로 기록 된 작업입니다. 즉, 각 행의 삭제가 기록되고 물리적으로 삭제됩니다.

제약 조건을 위반하지 않는 행을 삭제할 수 있으며 외래 키 또는 다른 제약 조건은 그대로 둡니다.

TRUNCATE도 기록 된 작업이지만 다른 방식입니다. TRUNCATE는 데이터가있는 데이터 페이지의 할당 해제를 기록합니다. 데이터 페이지 할당 해제는 데이터 행이 실제로 데이터 페이지에 여전히 존재하지만 범위가 재사용을 위해 비어있는 것으로 표시되었음을 의미합니다. 이것이 TRUNCATE가 DELETE보다 빠른 작업을 수행하게하는 이유입니다.

외래 키 제약 조건이있는 테이블은 TRUNCATE 할 수 없습니다. 제약 조건을 제거하고 테이블을 자르고 제약 조건을 다시 적용해야합니다.

TRUNCATE는 모든 ID 열을 기본 시드 값으로 재설정합니다.


"각 행의 삭제는 기록되고 물리적으로 삭제됩니다 . " 맞습니까? MSDN 블로그 가 즉시 제거되지 않습니다 말한다. 이것이 Postgres도 작동하는 방식입니다.
Brad Koch 2013 년

2

truncate는 모든 행을 제거하지만 테이블 자체는 제거하지 않습니다. 본질적으로 where 절없이 삭제하는 것과 동일하지만 일반적으로 더 빠릅니다.


트랜잭션을 기록하지 않기 때문에 자르는 것이 더 빠르기 때문에 (내 생각에) 삭제에서 할 수있는 것처럼 자르기에서 롤백 할 수 없습니다.
Steven Murawski

2

위의 문장 중 하나에 대한 수정 사항이 있습니다. "자르기를 롤백 할 수 없습니다."

잘라내기를 롤백 할 수 있습니다. 외래 키 참조가있는 경우와 같이 테이블 자르기 또는 삭제를 수행 할 수없는 경우가 있습니다. 월별보고와 같은 작업의 경우 더 이상 필요하지 않으면 테이블을 삭제했을 것입니다. 이 롤업보고를 더 자주 수행하는 경우 테이블을 대신 유지하고 자르기를 사용합니다.

도움이 되었기를 바랍니다. 유용한 정보가 더 있습니다.

자세한 내용은 다음 기사를 참조하십시오. http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

또한 삭제와 자르기에 대한 자세한 내용은 다음 문서를 참조하세요. http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

감사! 제프


2

TRUNCATE TABLE은 WHERE 절이없는 DELETE 문과 기능적으로 동일합니다. 둘 다 테이블의 모든 행을 제거합니다. 그러나 TRUNCATE TABLE은 DELETE보다 더 빠르고 시스템 및 트랜잭션 로그 리소스를 적게 사용합니다.

DELETE 문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대한 항목을 트랜잭션 로그에 기록합니다. TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용되는 데이터 페이지를 할당 해제하여 데이터를 제거하며 페이지 할당 해제 만 트랜잭션 로그에 기록됩니다.

TRUNCATE TABLE은 테이블에서 모든 행을 제거하지만 테이블 구조와 해당 열, 제약 조건, 인덱스 등은 그대로 유지됩니다. ID가 새 행에 사용하는 카운터는 열의 시드로 재설정됩니다. ID 카운터를 유지하려면 대신 DELETE를 사용하십시오. 테이블 정의 및 해당 데이터를 제거하려면 DROP TABLE 문을 사용합니다.

FOREIGN KEY 제약 조건에서 참조하는 테이블에서는 TRUNCATE TABLE을 사용할 수 없습니다. 대신 WHERE 절없이 DELETE 문을 사용하십시오. TRUNCATE TABLE은 기록되지 않기 때문에 트리거를 활성화 할 수 없습니다.

인덱싱 된 뷰에 참여하는 테이블에는 TRUNCATE TABLE을 사용할 수 없습니다.

에서 http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx


2

SQL 표준에서 DROP 테이블은 테이블과 테이블 스키마를 제거합니다. TRUNCATE는 모든 행을 제거합니다.


1

여기에있는 대답은 질문과 일치하지만, 당신이 묻지 않은 질문에 대답 할 것입니다. "잘라 내기 또는 삭제를 사용해야합니까?" 테이블에서 모든 행을 제거하는 경우 훨씬 더 빠르기 때문에 일반적으로 자르기를 원할 것입니다. 왜 훨씬 더 빠른가요? 적어도 Oracle의 경우 최고 수위 표시를 재설정합니다 . 이것은 기본적으로 데이터의 역 참조이며 db가 다른 용도로 재사용 할 수 있습니다.


1

삭제 및 자르기

  1. DELETE문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대한 항목을 트랜잭션 로그에 기록합니다.TRUNCATE TABLE테이블 데이터를 저장하는 데 사용되는 데이터 페이지를 할당 해제하여 데이터를 제거하고 트랜잭션 로그에 페이지 할당 해제 만 기록합니다.
  2. 우리는 WHERE절을 사용할 수 DELETE있지만TRUNCATE 당신은 그것을 사용할 수 없습니다
  3. DELETE문이 행 잠금을 사용하여 실행되고, 테이블의 각 행은 삭제 잠겨 있습니다.TRUNCATE TABLE항상 테이블과 페이지를 잠그지 만 각 행은 잠급니다.
  4. DELETE문이 실행될, 테이블은 여전히 삭제 작업이 테이블 잠금을 사용하지 않는 빈 pages.If를 포함 할 수 있습니다, 테이블 (힙)는 많은 빈 페이지가 포함됩니다. 인덱스의 경우 삭제 작업은 빈 페이지를 남겨 둘 수 있지만
    페이지는 백그라운드 정리 프로세스에 의해 빠르게 할당 해제됩니다.
  5. TRUNCATE TABLE 테이블에서 모든 행을 제거하지만 테이블 구조와 해당 열, 제약 조건, 인덱스 등은 그대로 유지됩니다.
  6. DELETE문은하지 않는 RESEEDID 열하지만 TRUNCATERESEEDSIDENTITY 열을
  7. 다음 TRUNCATE TABLE과 같은 테이블 에는 사용할 수 없습니다 .
    1. 에 의해 참조됩니다 FOREIGN KEY제약 조건에 . (자신을 참조하는 외래 키가있는 테이블을자를 수 있습니다.)
    2. 인덱싱 된 뷰에 참여합니다.
    3. 트랜잭션 복제 또는 병합 복제를 사용하여 게시됩니다.
  8. TRUNCATE TABLE 작업이 개별 행 삭제를 기록하지 않기 때문에 트리거를 활성화 할 수 없습니다.

1

& 드롭 전체 테이블의 모든 구조를 삭제

truncate 테이블에서 모든 행을 삭제하는 것은 행의 인덱스도 삭제한다는 점에서 삭제와 다릅니다.


1

문 삭제

Delete Statement delete table rows and return the number of rows is deleted from the table.이 명령문에서는 where 절을 사용하여 테이블에서 데이터를 삭제합니다.

  • Delete 문은 레코드를 하나씩 삭제하므로 Truncate 문보다 느립니다.

Truncate 문

Truncate 문 테이블에서 모든 행을 삭제하거나 제거했습니다.

  • 테이블에서 모든 레코드를 삭제했기 때문에 Delete 문보다 빠릅니다.
  • Truncate 문이 테이블에서 삭제 된 행 수를 반환하지 않습니다.

Drop 문

Drop 문은 테이블 구조뿐만 아니라 모든 레코드를 삭제했습니다.


0

지우다

DELETE 명령은 테이블에서 행을 제거하는 데 사용됩니다. WHERE 절은 일부 행만 제거하는 데 사용할 수 있습니다. WHERE 조건을 지정하지 않으면 모든 행이 제거됩니다. DELETE 작업을 수행 한 후 변경 사항을 영구적으로 적용하거나 실행 취소하려면 트랜잭션을 커밋하거나 롤백해야합니다.

자르기

TRUNCATE는 테이블에서 모든 행을 제거합니다. 작업을 롤백 할 수 없습니다. 따라서 TRUCATE가 더 빠르고 DELETE만큼 실행 취소 공간을 많이 사용하지 않습니다.

출처 : http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.