insert vs update 뭐가 더 빠를까

gryoh·2023년 5월 22일
0

당연히 insert가 빠르지 않을까? 라는 느낌적인 느낌(?)만 가진채 지내왔는데 진짜 그런지 궁금해졌다.

결론! 데이터양에 따라 또는 여러 케이스에 따라 insert vs update의 결과가 달라진다


우선, insert와 update의 동작 순서를 알아보자

insert

  1. n 로그 기록
  2. n HWM BUMP UP
  3. n 인덱스의 개수
  4. n 롤백을 위한 로그 기록
  5. n 디스크 I/O

INSERT 작업은 위와 같이 4가지 현상에 의해 성능이 저하된다.
이는 어떤 데이터베이스를 이용해도 동일하게 발생하는 현상이다.
데이터베이스는 작업터베이스 장애에 대해 데이터를 보호해야 하는 중요한 책임을 가지고 있다.
이와 같은 이유에서 실제 데이터베이스에서 INSERT 작업을 수행하기 전에 어떤 작업을 수행하는지에 대한 로그를 기록해야 한다.

이와 같은 기법을 선 로그(LOG AHEAD) 기법이라고 한다.
실제 INSERT를 수행하기 전에 로그를 기록하기 때문에 우리는 언제든지 INSERT 작업 중 데이터베이스에 문제가 발생해도 복구가 가능하게 되는 것이다.
실제 INSERT 작업과 관계없는 로그를 기록해야 하기 때문에 INSERT의 성능은 저하된다.

많은 데이터를 INSERT하게 되면 *HWM BUMP UP은 많은 횟수가 발생하게 될 것이다. 하지만, *HWM BUMP UP은 고비용의 내부적인 작업이다. 따라서, 대용량의 데이터를 저장한다면 *HWM BUMP UP의 횟수 증가로 INSERT의 성능은 저하된다.

INSERT의 속도와 인덱스의 개수는 INSERT의 성능 향상을 위해 매우 중요한 요소이다.
데이터를 테이블에 저장하는 것은 여유 공간을 가지고 있는 데이터 블록에 해당 데이터를 저장하면 된다.
하지만, 인덱스에는 정해진 위치가 존재하게 되므로 정해진 위치를 찾는 프로세스가 수행된다.
따라서, 해당 테이블에 인덱스가 10개라면 이와 같이 저장되는 데이터에 대해 인덱스에서의 위치를 찾기 위해 정해진 위치를 찾는 프로세스가 10번 수행되어야 할 것이다.
이와 같기 때문에 인덱스의 개수가 많다면 INSERT의 성능이 저하되는 것은 당연한 사실일 것이다.


*HWM BUMP UP
HWM BUMP UP은 오라클 데이터베이스의 내부적인 요소이다. 실제 INSERT를 수행하게 되면 해당 테이블에 할당되어 있는 공간에 데이터를 저장하게 되며 해당 공간을 익스텐트라고 부르게 된다. 익스텐트에는 HWM가 설정되어 있어 데이터는 HWM 앞의 블록에만 저장된다. 이 뜻은 무엇을 의미하는 것인가 HWM 앞까지 데이터를 저장한 후에는 HWM가 뒤로 후진해야만 데이터를 INSERT할 수 있다는 의미가 된다. 이를 HWM BUMP UP이라 한다.


update

  1. 로그 기록
  2. n UPDATE 컬럼이 사용된 인덱스의 개수
  3. n 롤백을 위한 로그 기록
  4. n 디스크 I/O

UPDATE의 경우에는 *HWM BUMP UP 이 발생하지 않게 된다. UPDATE가 수행되면 해당 컬럼을 인덱스의 컬럼으로 구성하고 있는 인덱스만을 갱신하게 된다. 그렇기 때문에 UPDATE 컬럼이 사용된 인덱스의 개수에 의해 UPDATE 성능은 저하된다.

-- index : sys_mod_dtime
update table
   set name = 'oh'
     , sys_mod_dtime = sysdate 
 where no = 1

이런 경우, 인덱스인 sys_mod_dtime를 갱신하고 다시 인덱스 정렬을 해야하기 때문에 성능저하가 올 수 있다. 따라서 UPDATE 컬럼이 사용된 인덱스의 개수에 의해 UPDATE 성능은 저하된다.


결론!!!

INSERT에 비해 UPDATE는 성능을 저하시키는 항목이 더 적다.

하지만, 동일한 양에 대해 INSERT와 UPDATE를 수행한다면 UPDATE가 성능 저하를 더 많이 발생시키게 된다. 이와 같은 이유는 왜일까?
분명히 성능 저하의 요소는 INSERT가 더 많기 때문에 INSERT가 더 많은 부하를 발생시킨다고 생각하기 쉽다.
이는 로그 기록과 롤백을 위한 로그 기록의 방식 차이 때문이다.
INSERT 작업은 로그에 이전 데이터라는 것은 존재하지 않는다.
INSERT 작업이 수행된 데이터의 위치 정보만을 가지게 된다면 우리는 언제든지 롤백을 수행할 수 있으며 장애 시 복구도 어렵지 않게 된다.
하지만, UPDATE의 경우에는 이전 데이터의 값이 존재하기 때문에 이전 데이터를 로그에 기록하게 된다.
따라서, 로그 기록 및 롤백을 위한 로그 기록에서 UPDATE가 INSERT에 비해 더 많은 데이터를 기록해야 하므로 디스크 I/O의 증가로 UPDATE의 성능은 INSERT의 성능보다 더욱 저하되게 된다.

0개의 댓글