ROLLBACK이 빠른 작업입니까?


답변:


14

SQL Server의 경우 커밋 작업은 LOP_COMMIT_XACT를 로그 파일에 기록하고 잠금을 해제하는 것 이상일 수 있습니다. 물론 BEGIN TRAN 이후 트랜잭션이 수행 한 모든 작업의 ​​ROLLBACK보다 빠릅니다.

커밋뿐만 아니라 거래의 모든 행동을 고려하고 있다면, 나는 당신의 진술이 사실이 아니라고 주장합니다. 외부 요소를 제외하고 데이터 디스크 속도와 비교 한 로그 디스크 속도는 트랜잭션이 수행 한 작업의 롤백이 처음 작업을 수행하는 것보다 빠를 가능성이 높습니다.

롤백은 변경 사항의 순차 파일을 읽고 메모리 내 데이터 페이지에 적용합니다. 원래 "작업"은 실행 계획을 생성하고, 페이지를 획득하고, 행을 조인하는 등의 작업을 수행해야했습니다.

편집 : 그것은 비트에 따라 다릅니다 ...

@JackDouglas는 롤백이 원래 작업보다 훨씬 오래 걸릴 수있는 상황 중 하나를 설명 하는 이 기사 를 지적했습니다 . 롤백은 대부분 단일 스레드이기 때문에 롤백하는 데 48 시간 이상 걸리는 병렬 처리를 사용하는 14 시간 트랜잭션입니다. 또한 버퍼 풀을 반복적으로 이탈하는 경우가 많으므로 더 이상 메모리 내 페이지 변경 사항을 되 돌리지 않아도됩니다.

따라서 이전 답변의 수정 된 버전입니다. 롤백이 얼마나 느려 집니까? 다른 모든 고려 사항은 일반적인 OLTP 트랜잭션의 경우 그렇지 않습니다. 일반적인 범위를 벗어나면 "do"보다 "실행 취소"하는 데 시간이 더 오래 걸릴 수 있지만 (이것은 혀 트위스터일까요?) 왜 "일"이 수행되었는지에 달려 있습니다.

편집 2 : 의견에 대한 논의에 이어 수행되는 작업이 커밋 대 롤백의 상대적 비용을 작업으로 결정하는 주요 요인임을 보여주기 위해 매우 고안된 예입니다.

두 개의 테이블을 만들고 비효율적으로 묶습니다 (페이지 당 낭비되는 공간).

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
SET NOCOUNT ON;
GO

CREATE TABLE dbo.Foo
(
    col1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , col2 CHAR(4000) NOT NULL DEFAULT REPLICATE('A', 4000)
)

CREATE TABLE dbo.Bar
(
    col1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , col2 CHAR(4000) NOT NULL DEFAULT REPLICATE('A', 4000)
)
GO

INSERT dbo.Foo DEFAULT VALUES
GO 100000

INSERT dbo.Bar DEFAULT VALUES
GO 100000

"잘못된"업데이트 쿼리를 실행하여 작업을 수행하는 데 걸리는 시간과 커밋을 실행하는 데 걸리는 시간을 측정하십시오.

DECLARE 
    @StartTime DATETIME2
    , @Rows INT

SET @Rows = 1

CHECKPOINT
DBCC DROPCLEANBUFFERS

BEGIN TRANSACTION

SET @StartTime = SYSDATETIME()

UPDATE
    dbo.bar
SET
    col2 = REPLICATE('B', 4000)
FROM
    dbo.bar b
INNER JOIN
    (
    SELECT TOP(@Rows)
        col1
    FROM
        dbo.foo
    ORDER BY
        NEWID()
    ) f
ON  f.col1 = b.col1
OPTION (MAXDOP 1)

SELECT 'Find and update row', DATEDIFF(ms, @StartTime, SYSDATETIME())

SET @StartTime = SYSDATETIME()

COMMIT TRANSACTION

SELECT 'Commit', DATEDIFF(ms, @StartTime, SYSDATETIME())
GO

다시 동일하게 수행하지만 롤백을 발행하고 측정하십시오.

    DECLARE 
    @StartTime DATETIME2
    , @Rows INT

SET @Rows = 1

CHECKPOINT
DBCC DROPCLEANBUFFERS

BEGIN TRANSACTION

SET @StartTime = SYSDATETIME()

UPDATE
    dbo.bar
SET
    col2 = REPLICATE('B', 4000)
FROM
    dbo.bar b
INNER JOIN
    (
    SELECT TOP(@Rows)
        col1
    FROM
        dbo.foo
    ORDER BY
        NEWID()
    ) f
ON  f.col1 = b.col1
OPTION (MAXDOP 1)

SELECT 'Find and update row', DATEDIFF(ms, @StartTime, SYSDATETIME())

SET @StartTime = SYSDATETIME()

ROLLBACK TRANSACTION

SELECT 'Rollback', DATEDIFF(ms, @StartTime, SYSDATETIME())
GO

@Rows = 1이면 합리적으로 일관성이 있습니다.

  • 찾기 / 업데이트를위한 5500ms
  • 3ms 커밋
  • 1ms 롤백

@ Rows = 100으로 :

  • 8500ms 찾기 / 업데이트
  • 15ms 커밋
  • 15ms 롤백

@ Rows = 1000으로 :

  • 15000ms 찾기 / 업데이트
  • 10ms 커밋
  • 500ms 롤백

원래 질문으로 돌아 가기 작업과 커밋을 수행하는 데 걸리는 시간을 측정하는 경우 롤백은 실제로 데이터를 수정하지 않고 업데이트 할 행을 찾는 데 소비되므로 롤백이 진행되고 있습니다. 커밋 작업을 단독으로 살펴보면 커밋이 "작업"을 거의 수행하지 않는 것이 분명합니다. 커밋은 "완료되었습니다".


2
'더 적은 일'이 반드시 더 빠를 필요없다
Jack Douglas

begin tran거래 횟수가 증가 한다는 것을 알았습니다 . 내가 당신을 이해한다면, rdbms는 COMMIT에서 모든 작업 (행에 참여하고 실행 계획을 생성합니다 ...)을하고 있습니까?
garik

3
아니오, 모든 작업은 커밋 전에 완료됩니다. 커밋 작업 자체는 상대적으로 거의 수행하지 않습니다.
Mark Storey-Smith

@ Mark 2m 행을 삽입하고 커밋 또는 롤백하는 거칠고 준비된 테스트를 수행했습니다. 롤백을 포함한 전체 시간은 커밋을 포함한 전체 시간에 대해 10 초에서 30 초로, 6 초에서 14 초로 다양했습니다. 물론 YMMV이지만 이것은 야구장 롤백이 적어도 내 환경에서 원래 트랜잭션보다 길거나 길다는 것을 나타냅니다.
잭 더글러스

2
커밋 작업이 완료되는 시간을 측정하려면 체크 포인트가 동시에 발행되지 않는 한 (분리되어 있고 관련이없는) 최소 시간이 될 것으로 예상됩니다. 내 말은, 커밋은 거의 수행하지 않지만 롤백은 커밋 전에 발생한 모든 것을 더 많이 수행합니다. 테스트의 차이는 다른 요소를 제안하지만 나중에 몇 가지 스크립트를 함께 작성해 보도록하겠습니다.
Mark Storey-Smith

13

Oracle의 경우 롤백을 변경하는 데 걸리는 시간보다 롤백에 시간이 오래 걸릴 수 있습니다. 이것은 종종 중요하지 않기 때문에

  1. 트랜잭션이 롤백되는 동안 잠금이 유지되지 않습니다.
  2. 낮은 우선 순위 백그라운드 프로세스로 처리됩니다.

SQL Server의 경우 상황이 같은지 확실하지 않지만 다른 사람은 그렇지 않다고 말할 것입니다 ...

에 관해서는 "왜"나는 말하고 싶지만 rollback해야 드문 일이 사라 잘못이 있고, 물론 보통 경우 commit는 최적화에 의미가 있습니다 - 그래서 훨씬 더 일반적인 될 가능성이 높습니다commit


9

롤백은 단지 "아, 신경 쓰지 마라"는 것이 아닙니다. 많은 경우에 이미 수행 한 작업을 취소해야합니다. 롤백 조작이 원래 조작보다 항상 느리거나 항상 빠는 규칙은 없습니다. 원래 트랜잭션이 병렬로 실행 되더라도 롤백은 단일 스레드입니다. 기다리고 있다면 계속 기다리는 것이 가장 안전합니다.

이 모든 것은 물론 SQL Server 2019 및 Accelerated Database Recovery (가변적 인 데이터 크기에 관계없이 즉각적인 롤백을 허용하는 데이터베이스 복구 )로 변경됩니다.


2
그리고 우리 모두는 어느 시점에서 "롤백하기 위해 시간이 오래 걸리고 다시 부팅하자"고 대화를 나?습니다.
Mark Storey-Smith

많은 고객들이하는 것을 보았습니다. 일부는 상대적으로 무질서하게 나오고, 다른 것은 훨씬 덜 운이 좋습니다.
Aaron Bertrand

1
@ MarkStorey-Smith-롤백 중반 재부팅시 SQL Server가 시작시 롤백을 계속하지 않아도됩니까?
Nick Chammas

2
예를 들어 @Nick에 의존합니다. 예를 들어, 재부팅 전에 롤백이 차단 된 경우 다른 프로세스가 종료 되었기 때문에 서비스를 다시 시작한 후 롤백이 훨씬 빠르게 작동 할 수 있습니다. 이 시나리오에는 많은 "만약"이 있습니다. 서버를 재부팅하거나 서비스를 다시 시작하여 문제를 "수정"할 때마다 더 심각한 문제가 발생할 수 있습니다.
Aaron Bertrand

2
@Nick, 그래, 그게 정확히 무슨 일이야. 내 의견은 "뺨에 혀"로 만들어 졌기 때문에 필연적으로 무언가가 예상대로 작동하지 않을 때마다 재부팅을하려는 행복한 사람들을 트리거하도록 설명해야합니다.
Mark Storey-Smith

8

모든 트랜잭션이 커밋 활동이 롤백보다 훨씬 나은 것은 아닙니다. 이러한 경우 중 하나는 SQL의 삭제 작업입니다. 트랜잭션이 행을 삭제하면이 행은 고스트 레코드로 표시됩니다. 커밋이 발행되고 고스트 레코드 정리 작업이 시작되면 이러한 레코드 만 '삭제'됩니다.

롤백이 대신 발행 된 경우 집중적 인 insert 문이 아니라 이러한 레코드에서 고스트 표시를 제거합니다.


특정 작업이 롤백에 최적화되는 방법에 대한 좋은 예입니다.
Mark Storey-Smith

5

모두가 아닙니다. 디스크 I / O 측면에서 두 작업이 사실상 동일하므로 PostgreSQL은 커밋보다 롤백하는 데 시간이 더 걸리지 않습니다. 실제로 이것이 다른 쿼리에 대해 최적화하는 것에 대한 질문 인 것처럼 커밋에 최적화 된 문제라고 생각하지 않습니다.

기본적인 질문은 디스크 레이아웃을 어떻게 해결하고 이것이 커밋과 롤백에 어떤 영향을 미치는지입니다. 커밋보다 느리게 롤백하는 주요 DB는 데이터를 업데이트 할 때 특히 클러스터 된 테이블에서 메인 데이터 구조 밖으로 데이터를 이동하고 롤백 세그먼트에 넣는 경향이 있습니다. 즉, 롤백 세그먼트를 삭제하지만 롤백하려면 모든 데이터를 다시 복사해야합니다.

PostgreSQL의 경우 모든 테이블은 힙 테이블이며 인덱스는 분리되어 있습니다. 이는 롤백 또는 커밋시 데이터를 다시 정렬 할 필요가 없음을 의미합니다. 커밋과 롤백이 모두 빠릅니다.

그러나 다른 것들을 조금 느리게 만듭니다. 예를 들어 기본 키 조회는 색인 파일을 통과 한 다음 힙 테이블에 도달해야합니다 (적용 가능한 색인이 없다고 가정). 이것은 큰 문제는 아니지만 다른 정보와 가시성을 확인하기 위해 여분의 페이지 조회 또는 심지어 임의의 페이지 조회 (해당 행에서 많은 업데이트가 발생한 경우)를 추가합니다.

그러나 여기서 속도는 쓰기 작업과 읽기 작업에 대한 PostgreSQL의 최적화 문제가 아닙니다. 일부 읽기 작업을 다른 작업보다 우선적으로 수행하는 것은 바람직하지 않습니다. 결과적으로 PostgreSQL은 다른 DB뿐만 아니라 평균적으로 수행합니다. 더 빠르거나 느린 특정 작업입니다.

따라서 실제 답변은 db가 읽기 측의 특정 워크로드에 최적화되어 있으며 이는 쓰기 측에 문제를 초래한다는 것입니다. 일반적으로 질문이있는 경우, 커밋은 항상 그렇지는 않지만 롤백보다 선호됩니다. 그러나 이것은 업데이트 중 하나가 수행하는 의미에 따라 다릅니다 (업데이트는 삭제와 다릅니다).


좋은 대답이지만 약간의 문제가 있습니다. "PostgreSQL의 경우 모든 테이블은 힙 테이블이며 인덱스는 분리되어 있습니다. 이는 롤백 또는 커밋시 데이터를 다시 정렬 할 필요가 없음을 의미합니다. 이는 데이터가 없어야하는 이유가 아닙니다. "커밋하는 것보다 느리게 롤백하는 주요 DB는 데이터를 이동시키는 경향이 있기 때문에"pg는 그렇지 않기 때문입니다. 오라클은 또한 기본적으로 힙 스토리지를 사용합니다. 가장 큰 차이점은 Oracle은 '진공'경로를 사용하지 않고 커밋 / 롤백시 모든 공간을 회수한다는 점입니다.
잭 더글러스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.