이전 글에서 Soft DELETE와 Hard DELETE를 비교하면서,
DELETE 연산이 일반적으로 UPDATE 연산에 비해 성능이 좋지 않다고 정리해습니다
이번 글에서는 그 이유에 대해 정리하려고 합니다
DELETE
명령어는 데이터베이스에서 행을 완전히 제거하기 때문에,
삭제하는 각 행의 모든 데이터를 트랜잭션 로그에 기록합니다
반면 UPDATE
명령어는 변경된 컬럼의 값만 로그에 기록하면 되기 때문에 상대적으로 적습니다
따라서 DELETE 작업은 로그 기록량이 많아 디스크 I/O 부하가 높아지고, 성능이 저하될 수 있습니다
테이블에 여러 개의 인덱스가 존재하는 경우,
DELETE 연산은 삭제 행과 관련된 모든 인덱스에서 데이터를 제거하는 작업을 수행합니다
이것은 인덱스가 많을수록 데이터베이스 서버에 부담을 주는 요인입니다
반면에 UPDATE는 특정 컬럼이 인덱스로 설정되지 않은 경우에는 인덱스를 변경하지 않고
데이터만 갱신할 수 있어, 인덱스 유지 비용이 상대적으로 낮습니다
DELETE 연산이 외래 키 제약 조건과 연관된 경우,
ON DELETE CASCADE
나 ON DELETE SET NULL
같은 옵션으로 연쇄적인 삭제 작업이 발생할 수 있습니다
이렇게 연쇄적인 삭제 작업이 일어나면 부하가 크게 증가합니다
UPDATE의 경우, 제약 조건을 검사하지만 DELETE처럼 연쇄적인 추가 연산을 일으키는 경우는 적기때문에
일반적으로 DELETE보다 비용이 적게 듭니다
대부분의 데이터베이스 시스템은 DELETE가 데이터를 즉시 물리적으로 제거하지 않습니다
대신 삭제된 공간에 마킹을 하고, 이 공간을 추후 재사용하는 형태로 관리합니다
이런 방식은 데이터베이스 내부적으로 추가적인 오버헤드를 유발할 수 있습니다
UPDATE 연산의 경우, 기존 데이터 위치에서 값을 수정하거나
최소한의 이동만 수행하기 때문에 DELETE보다 오버헤드가 상대적으로 적습니다
위와같은 이유들로 인해 DELETE 연산은 UPDATE 연산에 비해 일반적으로 성능 저하가 발생합니다
데이터베이스 성능 최적화를 고려할 때는 가능하면 DELETE 연산의 사용을 최소화하거나,
그 영향력을 고민해야합니다