티스토리 뷰

728x90
반응형

 

대용량 데이터를 일괄적으로 등록을 하거나 수정을 진행할 때 등록인지 수정인지를 우선 체크해야 하는 경우가 있다.

간단하게 흔히 사용할 만한 방식을 말하자면,

 

ex) TABLE : A

  1. A 테이블에 존재하는 데이터를 리스트(SELECT)로 가져온다. 그 이후 stream filter 를 이용하여 해당 데이터가 이미 존재하는 데이터인지 아니면 신규 데이터인지 foreach를 통해 확인하는 방법
  2. 신규 데이터 리스트에 대한 foreach를 돌리면서 해당 정보에 대한 A 테이블 정보가 있는지 그때 마다 DB에 요청하여 등록 또는 수정여부를 확인하는 방법

1번과 2번 둘 다 가능한 방법이지만 1번은 어느정도 데이터까지는 서버에서 체크를 하기에 이상이 없겠지만 결국 특정 데이터량 위치까지 갔을때는 속도에 문제가 될 이유가 됩니다.(그렇지만 그렇게 데이터가 막 100만개 이상이 아닌경우는 뭐… 낫배드)

 

2번은 DB 커넥션인 굉장히 많이 발생하게 되는 부분이기에 데이터가 많아지면 많아질수록 과부화가 올 수 있는 방법이다.(이건 정말 암…덩어리)

 

이보다 더 좋은 방법이 없을까? 곰곰히 생각해보면 이런생각을 하게 된다. 그냥 insert 할때 데이터 있는지 체크해주고 있으면 UPDATE 처리해주는 방법은 없을까?? 너무 좋게도 있다.

ON DUPLICATE KEY UPDATE 를 이용하게 될 경우 생각하고 있는 방식을 그대로 적용할 수 있다.

 

ex)

facebook에서 나의 게시글을 일괄적으로 들고와 db에 등록하는 방식이라고 생각해보자

데이터는 하루에 20분마다 요청하여 들고오는 방식이다.

그럴 경우 우린 1번과 2번같은 방법을 통해 데이터를 insert할지 아니면 update를 할지 정하게 될 것이다. 하지만 아래에 있는 쿼리를 이용하게 된다면 insert하는 동시에 해당 데이터가 존재하는지 primary key 와 unique key 를 통해 확인하여 insert 대신 update 를 진행하게 된다.

 

<!-- 같은 pk의 데이터일 경우 업데이트를 진행 -->
		INSERT INTO sns_facebook_channel (
			  fb_post_id
			, fb_user_id
			, fb_message
			, fb_caption
			, fb_description
			, fb_picture
			, fb_source
			, fb_link
			, fb_created_time
			, create_date
			, modify_date
		) VALUES (
		 	  #{postId,jdbcType=VARCHAR}
			, #{userId,jdbcType=VARCHAR}
			, #{message,jdbcType=VARCHAR}
			, #{caption,jdbcType=VARCHAR}
			, #{description,jdbcType=VARCHAR}
			, #{picture,jdbcType=VARCHAR}
			, #{source,jdbcType=VARCHAR}
			, #{link,jdbcType=VARCHAR}
			, #{createdTime,jdbcType=VARCHAR}
			, sysdate()
			, sysdate()
		) ON DUPLICATE KEY UPDATE   
			  fb_user_id = #{userId,jdbcType=VARCHAR}
			, fb_message = #{message,jdbcType=VARCHAR}
			, fb_caption = #{caption,jdbcType=VARCHAR}
			, fb_description = #{description,jdbcType=VARCHAR}
			, fb_picture = #{picture,jdbcType=VARCHAR}
			, fb_source = #{source,jdbcType=VARCHAR}
			, fb_link = #{link,jdbcType=VARCHAR}
			, modify_date = sysdate()

 

이러한 방식은 대용량 데이터를 일괄적으로 처리해야하는 상황에서 유용하게 사용할 수 있는 방식이다.

728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함