SQL에서 TRUNCATE와 DELETE의 차이점은 무엇입니까?


303

SQL TRUNCATEDELETESQL 의 차이점은 무엇입니까 ?

귀하의 답변이 플랫폼에 특정한 경우, 그 사실을 알려주십시오.


4
모든 답변은 플랫폼에 따라 다릅니다. 표준 SQL에는 TRUNCATE 명령이 없습니다. 따라서 이는 독점적 인 기능이며 각 DBMS 공급 업체와는 다른 것을 의미합니다.
nvogel

대답은 sqlvogel이 지적했듯이 이것은 비표준 명령 (TRUNCATE)이기 때문에 구현에 따라 다릅니다. 이 태그를 'oracle'로 남겨 두거나 커뮤니티 위키 스타일의 답변으로 만들고 각 주요 RDBMS (Oracle, MS-MSQL, PostgreSQL은 모두 TRUNCATE를 구현 함)에 대한 결과를 입력하십시오.
reedstrm

트랜잭션이 완료되면 COMMITED를 의미하는 경우 TRUNCATE 명령을 롤백 할 수 없지만 LOG 파일에서 DELETE 명령이 로그 파일에 기록되므로 나중에 LOG 파일에서 롤백해야 할 경우 로그 파일에 DELETE 명령을 롤백 할 수 있습니다.

답변:


272

차이점 목록은 다음과 같습니다. 오라클 고유의 기능을 강조했으며 커뮤니티가 다른 공급 업체의 특정 차이점을 추가 할 수 있기를 바랍니다. 대부분의 공급 업체에 공통적 인 차이점은 아래에 강조된 차이점과 함께 제목 바로 아래로 갈 수 있습니다.


일반 개요

테이블에서 모든 행을 빠르게 삭제하고 실제로 행을 원하고 테이블에 대해 외래 키가 없으면 TRUNCATE가 DELETE보다 빠를 것입니다. .

아래에 자세히 설명 된 것처럼 다양한 시스템 별 문제를 고려해야합니다.


명세서 유형

삭제는 DML, 잘림은 DDL입니다 ( DDL 및 DML이란 무엇입니까? ).


커밋 및 롤백

공급 업체에 따라 다름

SQL * 서버

잘라내기를 롤백 할 수 있습니다.

PostgreSQL

잘라내기를 롤백 할 수 있습니다.

신탁

TRUNCATE는 DDL이므로 명령문 실행 전과 후에 두 개의 커밋이 관련됩니다. 따라서 잘라내기를 롤백 할 수 없으며 잘라 내기 프로세스의 실패로 인해 커밋이 발행됩니다.

그러나 아래의 플래시백을 참조하십시오.


우주 매립

삭제는 공간을 복구하지 않습니다, 잘라내 기는 공간을 복구합니다

신탁

REUSE STORAGE 절을 사용하면 데이터 세그먼트가 할당 해제되지 않으므로 테이블을 데이터와 함께 다시로드하는 경우 약간 더 효율적일 수 있습니다. 최고 워터 마크가 재설정됩니다.


행 범위

삭제는 모든 행을 제거하거나 행의 서브 세트 만 제거하는 데 사용할 수 있습니다. 잘림은 모든 행을 제거합니다.

신탁

테이블이 분할되면 개별 파티션이 분리되어 잘릴 수 있으므로 모든 테이블 데이터를 부분적으로 제거 할 수 있습니다.


객체 유형

클러스터 내의 테이블 및 테이블에 삭제를 적용 할 수 있습니다. 잘림은 테이블 또는 전체 클러스터에만 적용됩니다. (Oracle 전용 일 수 있음)


데이터 객체 아이덴티티

신탁

삭제는 데이터 오브젝트 ID에 영향을 미치지 않지만 , 테이블 작성 이후 테이블에 대한 삽입이없는 경우를 제외 하고 truncate는 새 데이터 오브젝트 ID를 지정합니다. 롤백 된 단일 삽입이라도 절단시 새 데이터 오브젝트 ID가 지정됩니다. .


플래시백 (오라클)

플래시백은 삭제에서 작동하지만 잘림은 플래시가 작업 전에 상태로 돌아가는 것을 방지합니다.

그러나 11gR2부터 FLASHBACK ARCHIVE 기능은 Express Edition을 제외하고이를 허용합니다.

Oracle에서 플래시백 사용 http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


특권

변하기 쉬운

신탁

테이블에서 다른 사용자 나 역할에게 삭제 권한을 부여 할 수 있지만 DROP ANY TABLE 권한 부여를 사용하지 않으면 절단을 수행 할 수 없습니다.


재실행 / 실행 취소

삭제는 소량의 재실행 및 대량의 실행 취소를 생성합니다. 자르기는 무시할만한 양을 생성합니다.


인덱스

신탁

자르기 조작은 사용할 수없는 색인을 다시 사용할 수있게합니다. 삭제하지 않습니다.


외래 키

활성화 된 외래 키가 테이블을 참조 할 때는 잘림을 적용 할 수 없습니다. 삭제 처리는 외래 키의 구성에 따라 다릅니다.


테이블 잠금

신탁

자르기에는 독점 테이블 잠금이 필요하고 삭제에는 공유 테이블 잠금이 필요합니다. 따라서 테이블 잠금을 비활성화하면 테이블에서 잘림 작업을 방지 할 수 있습니다.


트리거

자르면 DML 트리거가 실행되지 않습니다.

신탁

DDL 트리거를 사용할 수 있습니다.


원격 실행

신탁

데이터베이스 링크를 통해 잘라낼 수 없습니다.


신원 열

SQL * 서버

잘림은 IDENTITY 열 유형의 시퀀스를 재설정하지만 삭제는 수행하지 않습니다.


결과 세트

대부분의 구현에서 DELETE명령문은 삭제 된 행을 클라이언트로 리턴 할 수 있습니다.

예를 들어 Oracle PL / SQL 서브 프로그램에서 다음을 수행 할 수 있습니다.

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

네 번째 진술을 이해하지 마십시오. DELETE [ ] FROM Table; FK가 중지하지 않으면 해당 테이블의 모든 행이 삭제됩니다. 그건 그렇고, 이것은 SQL Server에 따라 다르며 FK가있는 테이블에서는 TRUNCATE를 사용할 수 없습니다.
Joe Pineda 2016 년

의견이 더 있습니다 : 오라클과 관련이 없다면 세 번째 진술에 동의하지 않습니다. 적어도 SQL S를 사용하면 삭제하거나 TRUNCATE하면 특별히 요청하지 않는 한 공간을 복구하지 않습니다 (예 : 데이터베이스 파일이 하드 드라이브에서 축소되지 않음).
Joe Pineda

1
5 차 진술 : SQL 2008 r2에서 TRUNCATE TABLE을 롤백 할 수 있음
Eric Labashosky

1
Postgresql은 TRUNCATE를 롤백 할 수 있으므로 자동 커밋하지 않습니다.
rfusca

5
DELETE는 삭제 된 행 수를 반환하지만 TRUNCATE는 반환하지 않습니다. 그것은 매우 어리석은 지적이지만 그것을 언급 할 가치가 있습니다 :)
Deepak Kumar Jha

190

자르기와 삭제의 차이점은 다음과 같습니다.

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+

테이블의 재설정 ID를 자릅니다. 무슨 의미입니까? 그러나 삭제는 어떻습니까?
Ravi

1
@jWeaver : 기본 키 필드에 대해 Identity Specification 속성을 True로 설정하면 해당 테이블에 데이터를 삽입 할 때 기본 키 열에 1,2,3,4,5와 같은 값이 유지됩니다. 1부터 시작하고 시드는 1)이며 테이블을 자르면 모든 ID 값이 손실되므로 해당 테이블에 데이터를 다시 삽입하기 시작하면 마지막으로 남은 위치가 아닌 1부터 시작됩니다. DELETE에서는 반대로, DELETE 문을 실행 한 후에도 ID 값을 유지합니다. 위 이미지의 DELETE 열에서 두 번째 비교 포인트 실수로 죄송합니다.
Bhaumik Patel

SQL SERVER에
Ravi

4
SQL Server 에서 TRUNCATE와 DELETE를 모두 롤백 할 수 있습니다 . 그리고 두 번째 줄에서 삭제 복용량은 정체성을 재설정하지 않습니다. 이제이 게시물을 어떻게 편집 할 수 있습니까? 그것은 StackOverflow에서 그림을 사용하는 것에 대한 나쁜 것입니다.
Mahmood Jenami

2
잘림이 롤백됩니다! (SQL Server)
Aimal Khan

55

하락

DROP 명령은 데이터베이스에서 테이블을 제거합니다. 모든 테이블의 행, 인덱스 및 권한도 제거됩니다. DML 트리거가 실행되지 않습니다. 작업을 롤백 할 수 없습니다.

절단

TRUNCATE는 테이블에서 모든 행을 제거합니다. 작업을 롤백 할 수 없으며 트리거가 발생하지 않습니다. 따라서 TRUNCATE는 빠르며 DELETE만큼 실행 취소 공간을 많이 사용하지 않습니다. 절단시 테이블 레벨 잠금이 추가됩니다.

지우다

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

보낸 사람 : http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
나 같은 초보자를위한 좋은 설명
카스 Kukreti

짧고 달콤한
ABH

23

추가해야 할 모든 좋은 답변 :

이후 TRUNCATE TABLEDDL (이다 데이터의 해상력 언어 )가 아닌 DML ( 데이터 조작 Langauge ) 명령의는 Delete Triggers실행되지 않습니다.


아, 트리거 ... 좋은 지적입니다. 내가 만든 목록에 추가하고 괜찮다면 Polara를 인정할 것입니다.
David Aldridge

SQL Server에서는 외래 키가있는 테이블을자를 수 없으므로 플랫폼에 따라 계단식 위치가 약해질 수 있습니다.
Meff

PostgreSQL에는 "TRUNCATE Trigger"가 있습니다
a_horse_with_no_name


17

SQL Server 또는 MySQL에서 자동 증분 기능이있는 PK가 있으면 truncate가 카운터를 재설정합니다.


명확히하기 위해, 테이블에 IDENTITY로 정의 된 열이있는 경우 SQL Server 용입니다. 삭제는 마지막 자동 할당 ID를 유지하는 반면 잘라내 기는 카운터를 재설정합니다.
Codewerks

질문에 ORACLE 태그가 지정되면이 답변은 잘못되어 다운 보팅됩니다.
Guy

죄송합니다, oracle 태그를 보지 못했습니다 :)
mathieu

+1 true이고 0으로 재설정합니다 . 대신 1 이 되길 원한다면 :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

커뮤니티 답변에이 내용을 추가하고 공급 업체별 문제를 문서화하는 데 좀 더 친숙해졌습니다
David Aldridge

12

"잘라내 기는 아무 것도 기록하지 않습니다"가 정확합니다. 나는 더 나아갈 것이다.

트랜잭션 컨텍스트에서 잘림이 실행되지 않습니다.

삭제보다 잘라 내기의 속도 이점은 분명합니다. 이러한 이점은 상황에 따라 사소한 것부터 엄청난 것까지 다양합니다.

그러나 의도하지 않게 참조 무결성을 중단하고 다른 제약 조건을 위반하는 것을 보았습니다. 트랜잭션 외부에서 데이터를 수정하여 얻는 힘은 그물없이 줄타기를 걸을 때 상속하는 책임과 균형을 이루어야합니다.


7

TRUNCATEDDL 문인 반면 DELETEDML 문입니다. 아래는 두 가지의 차이점입니다.

  1. 으로 TRUNCATEDDL입니다 ( 데이터 정의 언어 ) 문 그것은이 영구적으로 변경하기 위해 커밋이 필요하지 않습니다. 그리고 이것이 truncate에 의해 삭제 된 행을 롤백 할 수없는 이유입니다. 반면에 DELETEDML ( 데이터 조작 언어 ) 문은 그 영향을 영구적으로 만들기 위해 명시적인 커밋이 필요합니다.

  2. TRUNCATEDELETEwhere 절을 사용하는 경우 항상 테이블에서 모든 행을 제거하고 테이블을 비워두고 테이블 구조를 그대로 유지 하고 조건부로 제거 할 수 있습니다.

  3. TRUNCATE TABLE명령문으로 삭제 된 행을 복원 할 수 없으며 TRUNCATE명령문 에서 where 절을 지정할 수 없습니다 .

  4. TRUNCATE명령문은 on delete trigger on DELETEstatement 와 달리 트리거를 발생시키지 않습니다 .

주제와 관련된 매우 좋은 링크는 다음과 같습니다 .


6

예, DELETE가 느리고 TRUNCATE가 빠릅니다. 왜?

DELETE는 레코드를 읽고, 제약 조건을 확인하고, 블록을 업데이트하고, 인덱스를 업데이트하고, 다시 실행 / 실행 취소를 생성해야합니다. 모든 시간이 걸립니다.

TRUNCATE는 단순히 테이블 (상위 워터 마크) 및 of에 대한 포인터를 데이터베이스에서 조정합니다! 데이터가 사라졌습니다.

이것은 Oracle 고유의 AFAIK입니다.


PostgreSQL도 이와 유사합니다.
Gavin M. Roy

6

절단

TRUNCATE SQL 쿼리는 개별 행 삭제를 기록하지 않고 테이블에서 모든 행을 제거합니다.

  • TRUNCATE는 DDL 명령입니다.
  • TRUNCATE는 테이블 잠금을 사용하여 실행되며 모든 레코드를 제거하기 위해 전체 테이블이 잠 깁니다.
  • TRUNCATE와 함께 WHERE 절을 사용할 수 없습니다.
  • TRUNCATE는 테이블에서 모든 행을 제거합니다.
  • 트랜잭션 로그에 최소한의 로깅이 있으므로 성능이 더 빠릅니다.
  • TRUNCATE TABLE은 테이블 데이터를 저장하는 데 사용 된 데이터 페이지를 할당 해제하여 데이터를 제거하고 페이지 할당 해제 만 트랜잭션 로그에 기록합니다.
  • 테이블에서 잘라내기를 사용하려면 테이블에 대해 최소한 ALTER 권한이 필요합니다.
  • 잘림은 Delete 문보다 적은 트랜잭션 공간을 사용합니다.
  • 인덱싱 된 뷰에는 자르기를 사용할 수 없습니다.
  • TRUNCATE는 DELETE보다 빠릅니다.

지우다

DELETE 대기열을 실행하려면 대상 테이블에서 삭제 권한이 필요합니다. DELETE에서 WHERE 절을 사용해야하는 경우 선택 권한도 필요합니다.

  • DELETE는 DML 명령입니다.
  • DELETE는 행 잠금을 사용하여 실행되며 테이블의 각 행은 삭제를 위해 잠 깁니다.
  • DELETE와 함께 where 절을 사용하여 특정 레코드를 필터링 및 삭제할 수 있습니다.
  • DELETE 명령은 WHERE 조건에 따라 테이블에서 행을 제거하는 데 사용됩니다.
  • 로그를 유지하므로 TRUNCATE보다 느립니다.
  • DELETE 문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다.
  • 열 유지의 ID DELETE는 ID를 유지합니다.
  • 삭제를 사용하려면 테이블에 대한 DELETE 권한이 필요합니다.
  • Delete는 Truncate 문보다 많은 트랜잭션 공간을 사용합니다.
  • 인덱스 된 뷰에서 삭제를 사용할 수 있습니다.

5

실수로 Delete / Truncate를 사용하여 테이블에서 모든 데이터를 제거했습니다. 커밋 된 트랜잭션을 롤백 할 수 있습니다. 삭제 / 잘라내 기가 발생할 때까지 마지막 백업을 복원하고 트랜잭션 로그를 실행하십시오.

아래 관련 정보 는 블로그 게시물 에서 가져온 것입니다 .

데이터베이스에서 작업하는 동안 데이터베이스 간의 차이점을 모르고 삭제 및 자르기를 사용합니다. 이 기사에서는 Sql에서 Delete와 Truncate의 차이점에 대해 설명합니다.

지우다:

  • 삭제는 DML 명령입니다.
  • Delete 문은 행 잠금을 사용하여 실행되며 테이블의 각 행은 삭제를 위해 잠 깁니다.
  • where 절에 필터를 지정할 수 있습니다.
  • 조건이 존재하면 지정된 데이터를 삭제합니다.
  • 작업이 개별적으로 기록되므로 활동을 트리거로 삭제하십시오.
  • 로그를 유지하기 때문에 잘림보다 느림

자르기

  • 잘림은 DDL 명령입니다.
  • 테이블 잘라내 기는 항상 테이블과 페이지를 잠그지 만 각 행을 잠그지 않습니다. 모든 데이터를 제거합니다.
  • Where 조건을 사용할 수 없습니다.
  • 모든 데이터를 제거합니다.
  • 작업이 개별 행 삭제를 기록하지 않기 때문에 테이블 잘라내 기가 트리거를 활성화 할 수 없습니다.
  • 로그를 보관하지 않기 때문에 성능면에서 더 빠릅니다.

참고 : 트랜잭션과 함께 사용하면 삭제 및 잘라내기를 모두 롤백 할 수 있습니다. 트랜잭션이 완료되고 커밋 된 경우 잘라 내기 명령을 롤백 할 수 없지만 로그 파일에서 삭제 명령이 로그 파일에 기록되므로 나중에 로그 파일에서 롤백해야 할 경우 로그 파일에서 삭제 명령을 롤백 할 수 있습니다.

자르려는 테이블을 참조하는 외래 키 제약 조건이 있으면 참조 테이블에 데이터가 없어도 작동하지 않습니다. 외래 키 검사는 DML이 아닌 DDL로 수행되기 때문입니다. 이 문제는 테이블에 대한 외래 키 제약 조건을 일시적으로 비활성화하여 해결할 수 있습니다.

테이블 삭제는 기록 된 작업입니다. 따라서 각 행의 삭제는 트랜잭션 로그에 기록되므로 속도가 느려집니다. 테이블 잘라내 기는 또한 테이블의 모든 행을 삭제하지만 각 행의 삭제는 기록하지 않고 대신 테이블의 데이터 페이지 할당 해제를 기록하므로 더 빠릅니다.

~ 실수로 Delete / Truncate를 사용하여 테이블에서 모든 데이터를 제거했습니다. 커밋 된 트랜잭션을 롤백 할 수 있습니다. 삭제 / 잘라내 기가 발생할 때까지 마지막 백업을 복원하고 트랜잭션 로그를 실행하십시오.


1
@Lucas에게 감사드립니다 : 그는 내용을 인라인했습니다. 나는 그것이 차이 소스에서 나온 것을 분명히하기 위해 인용 부호에 넣었습니다.
AstroCB

4

SQL Server 2005에서는 자르기를 롤백 할 있다고 생각합니다.


4

지우다

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

절단

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

하락

DROP 명령은 데이터베이스에서 테이블을 제거합니다. 모든 테이블의 행, 인덱스 및 권한도 제거됩니다. DML 트리거가 실행되지 않습니다. 작업을 롤백 할 수 없습니다.


DROP 및 TRUNCATE는 DDL 명령 인 반면 DELETE는 DML 명령입니다. 따라서 DELETE 조작은 롤백 (실행 취소) 될 수 있지만 DROP 및 TRUNCATE 조작은 롤백 할 수 없습니다.

보낸 사람 : http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


이것이 현재 답변에 무언가를 추가합니까?
David Aldridge

3

트랜잭션에 랩핑 된 경우 TRUNCATE를 롤백 할 수 있습니다.

아래 두 참조를 참조하여 직접 테스트하십시오.

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETE는 SQL 인터뷰에서 악명 높은 질문 중 하나입니다. 면담 자에게 올바르게 설명해야합니다. 그렇지 않으면 비용이 발생할 수 있습니다. 문제는 많은 사람들이 잘 알지 못하기 때문에 예라고 자르면 롤백 할 수 있다고 대답하면 대답을 잘못 생각할 것입니다.


2

원래 답변에 대한 작은 수정-삭제는 상당한 양의 다시 실행을 생성합니다 (실행 취소 자체가 다시 실행으로 보호됨). 이것은 자동 추적 출력에서 ​​볼 수 있습니다.

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

오래된 스레드이지만 내 이해에 따르면 잘라내 기는 실행 취소 및 다시 실행을 생성하는 데 충분한 양의 다시 실행 로그 만 생성합니다.
Saurabh Sinha

2

다음은 SQL Server의 DELETE와 TRUNCATE의 차이점 에 대한 자세한 답변입니다 .

데이터 제거 : 먼저, 둘 다 테이블에서 행을 제거하는 데 사용할 수 있습니다.
그러나 DELETE를 사용하여 테이블뿐만 아니라 VIEW 또는 공급자 기능에 따라 OPENROWSET 또는 OPENQUERY의 결과에서 행을 제거 할 수도 있습니다.

FROM Clause : DELETE를 사용하면 다른 FROM 절을 사용하여 다른 테이블의 행을 기준으로 한 테이블 / view / rowset_function_limited에서 행을 삭제할 수도 있습니다. 해당 FROM 절에서 일반 JOIN 조건을 작성할 수도 있습니다. 실제로 SELECT를 DELETE로 바꾸고 열 이름을 제거하여 집계 함수를 포함하지 않는 SELECT 문에서 DELETE 문을 작성할 수 있습니다.
TRUNCATE를 사용하면 그렇게 할 수 없습니다.

WHERE : TRUNCATE는 WHERE 조건을 가질 수 없지만 DELETE는 가능합니다. 즉, TRUNCATE를 사용하면 특정 행 또는 특정 행 그룹을 삭제할 수 없습니다. TRUNCATE TABLE은 WHERE 절이없는 DELETE 문과 유사합니다.

성능 : TRUNCATE TABLE이 더 빠르며 시스템 및 트랜잭션 로그 리소스를 더 적게 사용합니다. 그리고 그 이유 중 하나는 두 명령문이 사용하는 잠금입니다. DELETE 문은 행 잠금을 사용하여 실행되며 테이블의 각 행은 삭제를 위해 잠 깁니다. TRUNCATE TABLE은 항상 테이블과 페이지를 잠그지 만 각 행은 잠그지 않습니다.

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

페이지 : DELETE 문이 실행 된 후에도 테이블에 빈 페이지가 포함될 수 있습니다. TRUNCATE는 테이블 데이터를 저장하는 데 사용 된 데이터 페이지를 할당 해제하여 데이터를 제거합니다.

트리거 : TRUNCATE는 테이블에서 삭제 트리거를 활성화하지 않습니다. 따라서 TRUNCATE를 사용하는 동안 매우주의해야합니다. 행이 삭제 될 때 일부 자동 정리 또는 로깅 조치를 수행하기 위해 삭제 트리거가 테이블에 정의 된 경우 TRUNCATE를 사용하지 않아야합니다.

ID 열 : 테이블에 ID 열이 포함 된 경우 TRUNCATE를 사용하면 해당 열의 카운터가 열에 대해 정의 된 시드 값으로 재설정됩니다. 시드가 정의되지 않은 경우 기본값 1이 사용됩니다. DELETE는 ID 카운터를 재설정하지 않습니다. 따라서 ID 카운터를 유지하려면 대신 DELETE를 사용하십시오.

복제 : 트랜잭션 복제 또는 병합 복제에 사용 된 테이블에 대해 DELETE를 사용할 수 있습니다.
트랜잭션 복제 또는 병합 복제와 관련된 테이블에는 TRUNCATE를 사용할 수 없습니다.

롤백 : DELETE 문을 롤백 할 수 있습니다.
트랜잭션이 TRANSACTION 블록으로 묶여 있고 세션이 닫히지 않은 경우 TRUNCATE를 롤백 할 수도 있습니다. 세션이 종료되면 TRUNCATE를 롤백 할 수 없습니다.

제한 사항 : DELETE 문이 트리거를 위반하거나 FOREIGN KEY 제약 조건이있는 다른 테이블의 데이터에서 참조하는 행을 제거하려고하면 실패 할 수 있습니다. DELETE가 여러 행을 제거하고 제거 된 행 중 하나가 트리거 또는 제한 조건을 위반하면 명령문이 취소되고 오류가 리턴되며 행이 제거되지 않습니다.
그리고 DELETE가 View에 대해 사용되는 경우 해당 View는 업데이트 가능한보기 여야합니다. 인덱싱 된 뷰에서 사용 된 테이블에 대해서는 TRUNCATE를 사용할 수 없습니다.
자체를 참조하는 외래 키가있는 테이블이 아닌 한, FOREIGN KEY 제약 조건에서 참조하는 테이블에 대해서는 TRUNCATE를 사용할 수 없습니다.


안녕하세요 Mangal-특히 SQL * Server 관련 문제에 대한 답변에 감사드립니다. 그 점을 커뮤니티 Wiki 답변과 통합 할 수 있다고 생각하십니까?
David Aldridge

예, 그러나 어떻게 그리고 어디서? 새로 온게 미안 해요
Mangal Pardeshi

"따라서 신원 카운터를 유지하려면 DELETE를 사용하십시오."DECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

가장 큰 차이점은 자르기는 삭제가 아닌 로그되지 않은 작업이라는 것입니다.

데이터베이스 충돌이 발생하는 경우 잘림으로 운영되는 데이터는 복구 할 수 없지만 삭제하면 복구 할 수 있습니다.

자세한 내용은 여기


1

DELETE 문 :이 명령은 where 절에 제공된 조건에 따라 테이블에서 행만 삭제하거나 조건이 지정되지 않은 경우 테이블에서 모든 행을 삭제합니다. 그러나 테이블을 포함하는 공간을 비우지 않습니다.

SQL DELETE 문의 구문은 다음과 같습니다.

table_name에서 삭제 [WHERE 조건];

TRUNCATE 문 :이 명령은 테이블에서 모든 행을 삭제하고 테이블이 포함 된 공간을 비우는 데 사용됩니다.


1

지우다

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

절단

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

자세한 내용은 방문

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/


1

두 작업의 또 다른 차이점은 테이블에 ID 열이 포함 된 경우 해당 열의 카운터가 TRUNCATE 아래에서 1 (또는 열에 대해 정의 된 시드 값)으로 재설정된다는 것입니다. DELETE는이 영향을 미치지 않습니다.


0

즉, 잘라내 기는 아무것도 기록하지 않으므로 (더 빠르지 만 취소 할 수 없음) 삭제는 기록됩니다 (더 큰 트랜잭션의 일부일 수 있으며 롤백되는 등). dev의 테이블에 원하지 않는 데이터가있는 경우 일반적으로 트랜잭션 로그를 채울 위험이 없으므로 잘라내는 것이 좋습니다.


0

편리한 이유는 수백만 행 테이블에서 데이터를 새로 고쳐야하지만 다시 작성하지 않으려는 경우입니다. "삭제 *"는 영원히 걸리지 만, 잘라 내기의 성능 영향은 무시할 수 있습니다.


0

dblink를 통해 DDL을 수행 할 수 없습니다.


0

matthieu의 게시물에 댓글을 달았지만 아직 담당자가 없습니다 ...

MySQL에서 자동 증분 카운터는 자르기로 재설정되지만 삭제로는 재설정되지 않습니다.


0

잘라내 기가 SQL Server에 아무것도 기록하지는 않습니다. truncate는 정보를 기록하지 않지만 TRUNCATE를 시작한 테이블에 대한 데이터 할당 해제 페이지를 기록합니다.

트랜잭션을 시작할 때 정의하면 잘린 레코드가 롤백 될 수 있으며 롤백 한 후에 잘린 레코드를 복구 할 수 있습니다. 그러나 커밋 된 잘린 트랜잭션 후 트랜잭션 로그 백업에서 잘린 레코드를 복구 할 수 없습니다.


0

절단부는 여기에서 롤백 할 수도 있습니다.

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

SQL에서 자르기 및 삭제는 테이블에서 데이터를 제거하거나 삭제하는 데 사용되는 두 가지 명령입니다. 기본적으로 두 가지 SQL 명령은 기본적으로 사용하기 전에 세부 사항에 익숙해 질 때까지 많은 문제를 일으킬 수 있습니다. 명령을 잘못 선택하면 프로세스가 매우 느리거나 너무 많은 데이터를 제거해야하고 로그 세그먼트가 충분하지 않은 경우 로그 세그먼트가 손상 될 수 있습니다. 그렇기 때문에 SQL에서 truncate and delete 명령을 언제 사용해야하는지 아는 것이 중요하지만이를 사용하기 전에 Truncate와 Delete의 차이점을 알고 있어야하며이를 기반으로 DELETE가 제거를위한 더 나은 옵션인지 확인할 수 있습니다. 데이터 또는 TRUNCATE를 사용하여 테이블을 제거해야합니다.

확인 참조 여기를 클릭하십시오


0

TRUNCATE TABLE 문을 실행하면 로깅 또는 트랜잭션 처리없이 테이블 내의 모든 레코드를 삭제하도록 SQL Server에 지시합니다.


0

DELETE 문은 특정 레코드를 삭제하기 위해 WHERE 절을 가질 수 있지만 TRUNCATE 문은 필요하지 않으며 전체 테이블을 정리합니다. 중요한 것은 DELETE 문이 삭제 된 날짜를 기록하지만 TRUNCATE 문은 기록하지 않습니다.


0

Microsoft SQL Server의 또 다른 차이점은 statement를 delete사용 output하여 삭제 된 레코드를 추적 할 수 있다는 것입니다 . 예 :

delete from [SomeTable]
output deleted.Id, deleted.Name

으로이 작업을 수행 할 수 없습니다 truncate.

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