[CS/데이터베이스] - 저장장치 관점에서 본 DELETE 성능이슈

황제연·2025년 4월 24일
0

CS학습

목록 보기
54/193
post-thumbnail

저장장치 관점에서 본 DELETE 성능 이슈

이번에는 일반적인 데이터베이스 저장장치로 자주 사용되는 HDD와 SSD 환경에서
DELETE 작업의 성능저하에 대해 살펴보겠습니다

HDD 환경에서 DELETE 성능 이슈

HDD는 물리적인 디스크 헤드가 데이터를 읽고 쓰는 방식으로 작동하기 때문에 랜덤 액세스가 느립니다
DELETE 작업은 데이터 자체뿐 아니라 연관된 모든 인덱스를 갱신해야 하며,
이 과정에서 빈번한 랜덤 쓰기 작업이 발생합니다

랜덤 접근 성능 저하

DELETE 작업은 삭제할 레코드 외에도 다양한 인덱스 페이지를 찾아가서 수정해야 합니다
이 과정에서 디스크 헤드가 여러 물리적인 위치를 이동하며,
각 I/O 요청마다 회전 지연(Rotational Latency)과 탐색 시간(Seek Time)이 발생합니다

이러한 반복적인 랜덤 I/O는 HDD에서 매우 비효율적이며,
대량의 DELETE가 발생할 경우 시스템 전체의 응답 속도를 저하시킬 수 있습니다

데이터 단편화(Fragmentation)

HDD에서 DELETE 작업이 반복되면 삭제된 레코드가 남긴 빈 공간이 디스크 전체에 불균형하게 분산되며,
데이터가 물리적으로 연속적인 위치가 아닌 곳에 흩어져 저장되는 단편화 현상으로 이어집니다
단편화된 디스크는 연속된 데이터를 읽기 위해 디스크 헤드가 여러 위치로 자주 이동해야 하므로,
읽기 작업 시 불필요한 탐색 시간이 추가로 발생합니다
이로 인해 전체적인 읽기 성능이 저하됩니다

이러한 단편화는 시간이 지날수록 누적되며 성능 저하를 가속시키는데,
이를 해결하기 위한 방법 중 하나가 바로 디스크 조각 모음입니다
조각 모음은 흩어진 데이터를 물리적으로 정리해 연속된 블록으로 재배치함으로써 데이터 접근 시간을 단축시킵니다

따라서 HDD 환경에서는 DELETE 쿼리 실행이 시스템에 상당한 부담을 줄 수 있으며,
이러한 환경에서는 Soft DELETE를 고려하는 것이 좋습니다

SSD 환경에서 DELETE 성능 이슈

SSD는 랜덤 접근 성능이 우수하여 HDD보다 DELETE 작업 시의 성능 부담이 적습니다
그러나 SSD 환경이라고 해서 DELETE 작업이 반드시 효율적인 것은 아닙니다

쓰기 증폭(Write Amplification)

SSD는 데이터를 페이지 단위로 읽고, 여러 페이지로 구성된 블록 단위로 삭제 및 재기록하는 구조입니다

문제는 블록 내의 일부 페이지만 변경되더라도, 전체 블록을 복사 후 삭제하고
다시 기록하는 '읽기-수정-쓰기' 작업이 필요합니다

DELETE 작업이 많을수록 불완전한 블록이 증가하고 그만큼 SSD가 블록을 재작성합니다
이러한 과정에서 SSD는 원래 의도한 I/O보다 더 많은 내부 쓰기를 수행하게 되며,
이를 쓰기 증폭(Write Amplification)이라 부릅니다
이 현상은 SSD의 성능 저하를 초래하고 수명에도 영향을 줍니다

이를 완화하기 위한 애플리케이션 측면에서의 방법이 Soft DELETE입니다
DELETE 쿼리문보다 UPDATE문을 통해 논리적 마킹하는 방식을 사용한다면
SSD 수명과 성능 측면에서 더 유리할 수 있습니다

지속적인 GC 프로세스

SSD의 플래시 메모리 특성상 기존 데이터를 직접 덮어쓸 수 없기 때문에,
삭제된 데이터가 있는 블록을 정리하는 'Garbage Collection(GC)' 과정을 주기적으로 수행합니다
이 GC 프로세스는 사용되지 않는 페이지를 식별하고,
유효한 데이터를 새 블록으로 복사한 후 기존 블록을 지우는 방식으로 진행됩니다

DELETE 작업이 자주 발생하는 시스템은 유휴 페이지가 비연속적으로 흩어지게 되며,
그로 인해 GC가 더 많은 블록을 대상으로 병합 및 삭제 작업을 반복합니다
이 과정은 SSD 컨트롤러 입장에서 추가적인 복사 및 삭제 연산을 발생시켜 성능이 저하됩니다

따라서 DELETE 대신 Soft Delete 방식을 사용한다면 앞선 문제를 방지할 수 있어
성능 유지에 도움이 됩니다

참고

profile
Software Developer

0개의 댓글