programing

잘라내기 vs 삭제 시작의 장단점

bestprogram 2023. 7. 16. 13:46

잘라내기 vs 삭제 시작의 장단점

다음 두 가지 진술을 사용할 경우의 장단점을 간략하게 설명해 주시겠습니까?

TRUNCATE TABLE dbo.MyTable

DELETE FROM dbo.MyTable

그들 둘 다 말과 행동이 같을 때 같은 일을 하는 것처럼 보이지만, 둘 사이에 반드시 차이가 있어야 합니다.

TRUNCATE롤백 데이터를 생성하지 않으므로 빠르게 처리할 수 있습니다.테이블에서 사용하는 데이터 페이지의 할당을 해제합니다.

이고 이를 "취소"수 있는 그나거실중이할삭래제취를합러다수니사있다면기야사음려해용을용하는을능소이고행▁▁you▁use니▁to,할▁to▁need▁ability실그러▁youun▁ifaction▁this야▁and,▁the를 사용해야 합니다.DELETE FROM롤백 기능을 제공합니다.

편집: 위의 내용은 SQL Server에 대해 올바르지 않습니다(Oracle에는 적용됨).SQL Server에서는 트랜잭션 내부에 있고 트랜잭션이 커밋되지 않은 경우 잘라내기 작업을 롤백할 수 있습니다.SQL Server의 관점에서 DELETE FROM과 TRUNKATE의 주요 차이점은 다음과 같습니다. "DELETE 문은 한 번에 하나씩 행을 제거하고 삭제된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다.TRUNKATE TABLE은 테이블 데이터를 저장하는 데 사용되는 데이터 페이지의 할당을 해제하여 데이터를 제거하고 페이지 할당 해제만 트랜잭션 로그에 기록합니다."

즉, 페이지 할당 해제만 트랜잭션 로그에 기록되고 각 행 삭제에서 삭제가 기록되기 때문에 잘라내는 동안 로깅이 적습니다.그것이 TRUNCATE가 번개처럼 빠른 이유 중 하나입니다.

또한 MSDN 링크에서는 외부 키 제약 조건에서 참조하거나 인덱싱된 보기에 참여하거나 트랜잭션 복제 또는 병합 복제를 사용하여 게시된 테이블을 잘라낼 수 없습니다.

편집 2: 또 다른 요점은 TRUNKATE TABLE이 사용자의 ID를 초기 시드로 재설정하는 반면 DELETE FROM은 중단된 위치에서 계속 증가한다는 것입니다.참조:벤 로빈슨의 대답.

다른 답변에서 언급되지 않은 또 다른 요점은TRUNCATE TABLE당신의 신원을 초기 시드로 재설정할 이지만, 반면에.DELETE FROM중단된 부분부터 계속 증가할 것입니다.

보안 관점과 또 다른 차이점은 TRUNKATE에는 테이블에 대한 ALTER 권한이 필요한 반면 DELETE에는 해당 테이블에 대한 DELETE 권한(드럼 롤)만 필요하다는 것입니다.

TRUNCATE TABLE트랜잭션을 기록하지 않습니다.그것은 큰 테이블에는 번개같이 빠르다는 것을 의미합니다.단점은 작업을 취소할 수 없다는 것입니다.

DELETE FROM에서는 삭제되는 각 행을 트랜잭션 로그에 기록하므로 작업에 시간이 오래 걸리고 트랜잭션 로그가 크게 증가합니다.장점은 필요한 경우 작업을 취소할 수 있다는 것입니다.

SQL Server에서 삭제와 잘라내기의 개요

다음 연결 후 전체 문서를 참조:SQL Server에서 삭제 또는 잘라내기

enter image description here

/*Truncate - Syntax*/
TRUNCATE TABLE table_name

/*Delete - Syntax*/
DELETE FROM table_name
WHERE some_condition

작업이 명시적 트랜잭션에서 실행된 경우에만 삭제 및 잘라내기를 롤백할 수 있습니다.그렇지 않으면 제거된 데이터를 복구하기 위해 복원을 수행해야 합니다.

근본적인 차이는 기록 방법에 있습니다.DELETE와 TRUNCATE는 서로 다르게 기록되지만 둘 다 정확히 동일한 방식으로 롤백할 수 있습니다.데이터를 변경하는 모든 작업이 기록됩니다.SQL Server에는 로깅되지 않는 작업이 없습니다.

매우 중요하고(이모) 다른 답변에 언급되지 않은 한 가지는TRUNCATE 안정성이 필요합니다.Sch-S에, 면에반에.DELETE행 잠금을 사용합니다.다음을 검사합니다.

BEGIN TRANSACTION;

BEGIN TRY
    -- Truncate below will take LCK_M_SCH_S lock for TABLE_A
    TRUNCATE TABLE TABLE_A

    -- Lets say the query below takes 5 hours to execute
    INSERT INTO
        TABLE_A
    SELECT
        *
    FROM
        GIANT_TABLE (NOLOCK)
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    THROW
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

이제 이 쿼리를 시작한 지 1-2분 후에 다음을 실행하려고 했다고 가정합니다.

SELECT COUNT(*) FROM TABLE_A (NOLOCK)

가 사한알림을 사용했다는 하세요.NOLOCK?이제 어떻게 될 것 같습니까? 왜요? 왜요? 5시간입니다. 왜요? ㅠㅠNOLOCK에는 조요가 합니다.Sch-S에 집착하는.TABLE_A그러나 그것은TRUNCATE조항이 있습니다.Sch-S이미 하고 있습니다.에, 그 자물쇠가 있습니다.TRUNCATE Sch-S테이블의 잠금은 기본적으로 다음 중 하나를 의미합니다.TABLE_A열 등을 추가/축소하여 변경하거나 잘립니다.다음과 같은 작업을 실행할 수도 없습니다.

SELECT object_id('TABLE_A')

이것도 5시간은 걸릴 겁니다.하지만, 만약 당신이 그것을 대체한다면,TRUNCATE와 함께DELETE FROM당신은 그것이 없을 것이라는 것을 알게 될 것입니다.Sch-S테이블을 잠그면 위의 쿼리가 고착되지 않습니다.

차점이다른의 또 다른 .DELETETRUNCATE테이블이 손상된 경우의 동작입니다.

예를 들어:

DELETE FROM table_name;

오류가 발생합니다.

Msg 3314, 레벨 21, 상태 3, 라인 1

데이터베이스 '...'에서 기록된 작업을 실행 취소하는 동안 로그 레코드 ID()에서 오류가 발생했습니다.일반적으로 특정 오류는 이전에 윈도우즈 이벤트 로그 서비스에서 오류로 기록됩니다.백업에서 데이터베이스 또는 파일을 복원하거나 데이터베이스를 복구합니다.

메시지 0, 레벨 20, 상태 0, 라인 0

현재 명령에서 심각한 오류가 발생했습니다.결과가 있으면 폐기해야 합니다.

하는 동안에TRUNCATE작동할 것:

TRUNCATE TABLE table_name;
-- Command(s) completed successfully.

게다가 모든 답, 고려해야 할 또 다른 점.Truncate트리거하지 않습니다.delete trigger테이블의, 하지만.delete문이 트리거합니다.delete trigger각 행에 대한 테이블의

잘라내기는 로깅을 수행하지 않고 삭제는 로깅을 수행하므로 레코드가 많이 있으면 로그가 방대합니다.

언급URL : https://stackoverflow.com/questions/3256242/pros-cons-of-truncate-vs-delete-from