SQL TRUNCATE
과 DELETE
SQL 의 차이점은 무엇입니까 ?
귀하의 답변이 플랫폼에 특정한 경우, 그 사실을 알려주십시오.
SQL TRUNCATE
과 DELETE
SQL 의 차이점은 무엇입니까 ?
귀하의 답변이 플랫폼에 특정한 경우, 그 사실을 알려주십시오.
답변:
차이점 목록은 다음과 같습니다. 오라클 고유의 기능을 강조했으며 커뮤니티가 다른 공급 업체의 특정 차이점을 추가 할 수 있기를 바랍니다. 대부분의 공급 업체에 공통적 인 차이점은 아래에 강조된 차이점과 함께 제목 바로 아래로 갈 수 있습니다.
테이블에서 모든 행을 빠르게 삭제하고 실제로 행을 원하고 테이블에 대해 외래 키가 없으면 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;
자르기와 삭제의 차이점은 다음과 같습니다.
+----------------------------------------+----------------------------------------------+
| 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) |
+----------------------------------------+----------------------------------------------+
하락
DROP 명령은 데이터베이스에서 테이블을 제거합니다. 모든 테이블의 행, 인덱스 및 권한도 제거됩니다. DML 트리거가 실행되지 않습니다. 작업을 롤백 할 수 없습니다.
절단
TRUNCATE는 테이블에서 모든 행을 제거합니다. 작업을 롤백 할 수 없으며 트리거가 발생하지 않습니다. 따라서 TRUNCATE는 빠르며 DELETE만큼 실행 취소 공간을 많이 사용하지 않습니다. 절단시 테이블 레벨 잠금이 추가됩니다.
지우다
DELETE 명령은 테이블에서 행을 제거하는 데 사용됩니다. WHERE 절은 일부 행만 제거하는 데 사용할 수 있습니다. WHERE 조건을 지정하지 않으면 모든 행이 제거됩니다. DELETE 조작을 수행 한 후 변경 사항을 영구적으로 만들거나 실행 취소하려면 트랜잭션을 커미트 또는 롤백해야합니다. 이 작업으로 인해 테이블의 모든 DELETE 트리거가 시작됩니다. 삭제할 때 행 레벨 잠금이 추가됩니다.
보낸 사람 : http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
추가해야 할 모든 좋은 답변 :
이후 TRUNCATE TABLE
DDL (이다 데이터의 해상력 언어 )가 아닌 DML ( 데이터 조작 Langauge ) 명령의는 Delete Triggers
실행되지 않습니다.
삭제 대 SQL 서버에서 자르기 요약
전체 기사는 다음 링크를 참조하십시오. http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
dotnet mob article : SQL Server에서 Vs Truncate 삭제
SQL Server 또는 MySQL에서 자동 증분 기능이있는 PK가 있으면 truncate가 카운터를 재설정합니다.
DBCC CHECKIDENT (table_name, RESEED, 1)
TRUNCATE
DDL 문인 반면 DELETE
DML 문입니다. 아래는 두 가지의 차이점입니다.
으로 TRUNCATE
DDL입니다 ( 데이터 정의 언어 ) 문 그것은이 영구적으로 변경하기 위해 커밋이 필요하지 않습니다. 그리고 이것이 truncate에 의해 삭제 된 행을 롤백 할 수없는 이유입니다. 반면에 DELETE
DML ( 데이터 조작 언어 ) 문은 그 영향을 영구적으로 만들기 위해 명시적인 커밋이 필요합니다.
TRUNCATE
DELETE
where 절을 사용하는 경우 항상 테이블에서 모든 행을 제거하고 테이블을 비워두고 테이블 구조를 그대로 유지 하고 조건부로 제거 할 수 있습니다.
TRUNCATE TABLE
명령문으로 삭제 된 행을 복원 할 수 없으며 TRUNCATE
명령문 에서 where 절을 지정할 수 없습니다 .
TRUNCATE
명령문은 on delete trigger on DELETE
statement 와 달리 트리거를 발생시키지 않습니다 .
주제와 관련된 매우 좋은 링크는 다음과 같습니다 .
예, DELETE가 느리고 TRUNCATE가 빠릅니다. 왜?
DELETE는 레코드를 읽고, 제약 조건을 확인하고, 블록을 업데이트하고, 인덱스를 업데이트하고, 다시 실행 / 실행 취소를 생성해야합니다. 모든 시간이 걸립니다.
TRUNCATE는 단순히 테이블 (상위 워터 마크) 및 of에 대한 포인터를 데이터베이스에서 조정합니다! 데이터가 사라졌습니다.
이것은 Oracle 고유의 AFAIK입니다.
절단
TRUNCATE SQL 쿼리는 개별 행 삭제를 기록하지 않고 테이블에서 모든 행을 제거합니다.
지우다
DELETE 대기열을 실행하려면 대상 테이블에서 삭제 권한이 필요합니다. DELETE에서 WHERE 절을 사용해야하는 경우 선택 권한도 필요합니다.
실수로 Delete / Truncate를 사용하여 테이블에서 모든 데이터를 제거했습니다. 커밋 된 트랜잭션을 롤백 할 수 있습니다. 삭제 / 잘라내 기가 발생할 때까지 마지막 백업을 복원하고 트랜잭션 로그를 실행하십시오.
아래 관련 정보 는 블로그 게시물 에서 가져온 것입니다 .
데이터베이스에서 작업하는 동안 데이터베이스 간의 차이점을 모르고 삭제 및 자르기를 사용합니다. 이 기사에서는 Sql에서 Delete와 Truncate의 차이점에 대해 설명합니다.
지우다:
- 삭제는 DML 명령입니다.
- Delete 문은 행 잠금을 사용하여 실행되며 테이블의 각 행은 삭제를 위해 잠 깁니다.
- where 절에 필터를 지정할 수 있습니다.
- 조건이 존재하면 지정된 데이터를 삭제합니다.
- 작업이 개별적으로 기록되므로 활동을 트리거로 삭제하십시오.
- 로그를 유지하기 때문에 잘림보다 느림
자르기
- 잘림은 DDL 명령입니다.
- 테이블 잘라내 기는 항상 테이블과 페이지를 잠그지 만 각 행을 잠그지 않습니다. 모든 데이터를 제거합니다.
- Where 조건을 사용할 수 없습니다.
- 모든 데이터를 제거합니다.
- 작업이 개별 행 삭제를 기록하지 않기 때문에 테이블 잘라내 기가 트리거를 활성화 할 수 없습니다.
- 로그를 보관하지 않기 때문에 성능면에서 더 빠릅니다.
참고 : 트랜잭션과 함께 사용하면 삭제 및 잘라내기를 모두 롤백 할 수 있습니다. 트랜잭션이 완료되고 커밋 된 경우 잘라 내기 명령을 롤백 할 수 없지만 로그 파일에서 삭제 명령이 로그 파일에 기록되므로 나중에 로그 파일에서 롤백해야 할 경우 로그 파일에서 삭제 명령을 롤백 할 수 있습니다.
자르려는 테이블을 참조하는 외래 키 제약 조건이 있으면 참조 테이블에 데이터가 없어도 작동하지 않습니다. 외래 키 검사는 DML이 아닌 DDL로 수행되기 때문입니다. 이 문제는 테이블에 대한 외래 키 제약 조건을 일시적으로 비활성화하여 해결할 수 있습니다.
테이블 삭제는 기록 된 작업입니다. 따라서 각 행의 삭제는 트랜잭션 로그에 기록되므로 속도가 느려집니다. 테이블 잘라내 기는 또한 테이블의 모든 행을 삭제하지만 각 행의 삭제는 기록하지 않고 대신 테이블의 데이터 페이지 할당 해제를 기록하므로 더 빠릅니다.
~ 실수로 Delete / Truncate를 사용하여 테이블에서 모든 데이터를 제거했습니다. 커밋 된 트랜잭션을 롤백 할 수 있습니다. 삭제 / 잘라내 기가 발생할 때까지 마지막 백업을 복원하고 트랜잭션 로그를 실행하십시오.
SQL Server 2005에서는 자르기를 롤백 할 수 있다고 생각합니다.
지우다
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
트랜잭션에 랩핑 된 경우 TRUNCATE를 롤백 할 수 있습니다.
아래 두 참조를 참조하여 직접 테스트하십시오.
TRUNCATE vs. DELETE는 SQL 인터뷰에서 악명 높은 질문 중 하나입니다. 면담 자에게 올바르게 설명해야합니다. 그렇지 않으면 비용이 발생할 수 있습니다. 문제는 많은 사람들이 잘 알지 못하기 때문에 예라고 자르면 롤백 할 수 있다고 대답하면 대답을 잘못 생각할 것입니다.
원래 답변에 대한 작은 수정-삭제는 상당한 양의 다시 실행을 생성합니다 (실행 취소 자체가 다시 실행으로 보호됨). 이것은 자동 추적 출력에서 볼 수 있습니다.
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
다음은 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를 사용할 수 없습니다.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
지우다
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/
dblink를 통해 DDL을 수행 할 수 없습니다.
잘라내 기가 SQL Server에 아무것도 기록하지는 않습니다. truncate는 정보를 기록하지 않지만 TRUNCATE를 시작한 테이블에 대한 데이터 할당 해제 페이지를 기록합니다.
트랜잭션을 시작할 때 정의하면 잘린 레코드가 롤백 될 수 있으며 롤백 한 후에 잘린 레코드를 복구 할 수 있습니다. 그러나 커밋 된 잘린 트랜잭션 후 트랜잭션 로그 백업에서 잘린 레코드를 복구 할 수 없습니다.
SQL에서 자르기 및 삭제는 테이블에서 데이터를 제거하거나 삭제하는 데 사용되는 두 가지 명령입니다. 기본적으로 두 가지 SQL 명령은 기본적으로 사용하기 전에 세부 사항에 익숙해 질 때까지 많은 문제를 일으킬 수 있습니다. 명령을 잘못 선택하면 프로세스가 매우 느리거나 너무 많은 데이터를 제거해야하고 로그 세그먼트가 충분하지 않은 경우 로그 세그먼트가 손상 될 수 있습니다. 그렇기 때문에 SQL에서 truncate and delete 명령을 언제 사용해야하는지 아는 것이 중요하지만이를 사용하기 전에 Truncate와 Delete의 차이점을 알고 있어야하며이를 기반으로 DELETE가 제거를위한 더 나은 옵션인지 확인할 수 있습니다. 데이터 또는 TRUNCATE를 사용하여 테이블을 제거해야합니다.
확인 참조 여기를 클릭하십시오
Microsoft SQL Server의 또 다른 차이점은 statement를 delete
사용 output
하여 삭제 된 레코드를 추적 할 수 있다는 것입니다 . 예 :
delete from [SomeTable]
output deleted.Id, deleted.Name
으로이 작업을 수행 할 수 없습니다 truncate
.