- 사용자의 ID를 migration 해줘야 하는 작업이 생겼다.
- 그냥 UPDATE를 진행해보니 사용기간이 길어 업데이트 해야 할 데이터가 많아 프로세스가 종료되는 문제가 발생했다. (다행히 테스트 서버였다.)
- 대용량 데이터를 업데이트하는 방법을 찾아보니 Batch Update 방식과 CTAS(Create Table As Select) 방식을 찾을 수 있었다.
- 나의 경우 바꿔야 할 테이블이 많고, 기간이 넉넉치 않아서 Batch Update 방식을 채용했다. (시간적 여유만 있다면 CTAS 방식을 해보고 싶었다. 66초짜리 쿼리가 4초면 된다고 한다.)
- 2번의 UPDATE 문들을 아래의 형태로 고친다.
DO $$
DECLARE
B record;
BEGIN
FOR B IN (SELECT * FROM ${baseline_table} WHERE ${condition}) LOOP
UPDATE ${target_table} A SET A.user_id = B.${change_user_id}
WHERE B.user_id = A.user_id;
COMMIT;
END LOOP;
END;
$$;
- 정상 작동을 확인한다.
CTAS 방식에 대해선 몇가지 링크를 첨부합니다.