회사에서 의도치않게 ISMS 프로젝트에서 혼자 회원 탈퇴&휴면 처리 프로세스 설계와 구현을 맡게 되었는데
이 과정에서 우리 개발 서버의 대용량 주문 테이블, 정산 테이블에 있는 회원들의 실제 개인 정보를 모두
마스킹 처리하여 업데이트 처리 해달라는 요구사항을 받게 되었다.
우선 큼지막한 테이블들의 데이터 현황을 추려보자면 다음과 같았다.
<고객 테이블>
<주문 마스터 테이블>
<주문 정산 테이블>
부장님이 이 모든 데이터를 UPDATE 하면 부하도 심할뿐더러 시간도 굉장히 오래걸릴거라고
더 효과적인 방법을 스스로 찾아서 해보라고 말씀해주셔서 곰곰히 생각하다가 요근래 열심히 공부중이던 SQLP 공부 내용에서 UPDATE 튜닝 단원의 내용이 생각나 실제로 적용해 보았다.
- 테이블 데이터를 갱신하는 본연의 작업
- 인덱스 데이터까지 갱신
- 버퍼 캐시에 없는 블록을 디스크에서 읽어 버퍼 캐시에 적재한 후에 갱신
- 내부적으로 Redo와 Undo 정보 생성
- 블록에 빈 공간이 없으면 새 블록 할당(→ Row Migration 발생)
- 대상테이블의 데이터로 temp 테이블 생성
- 대상테이블의 제약조건 및 인덱스 삭제
- 대상테이블 truncate
- temp 테이블에 있는 원본 데이터를 update 할 값으로 수정하여 대상테이블에 insert
- 대상테이블에 제약조건 및 인덱스 생성
CREATE TABLE ORDER_MST_BACKUP AS
SELECT * FROM ORDER_MST;
ALTER TABLE ORDER_MST DROP CONSTRAINT ORDER_MST_PK;
DROP INDEX ORDER_MST_X1;
ALTER TABLE ORDER_MST DISABLE CONSTRAINT SYS_C001111;
TRUNCATE TABLE ORDER_MST;
INSERT INTO ORDER_MST
SELECT TEST_COL1, TEST_COL2, TEST_COL3,'상세주소' TEST_COL54, TEST_COL5,
'이메일마스킹@test.com' TEST_COL6,'0100000000' TEST_COL7, TEST_COL8
FROM ORDER_MST_BACKUP;
( 이 때도 엄청 쫄렸다..오래걸려서😳)
ALTER TABLE ORDER_MST ADD CONSTRAINT ORDER_MST_PK(COL1);
CREATE INDEX ORDER_MST_X1 ON ORDER_MST (TEST_COL1,TEST_COL2,TEST_COL3,TEST_COL4);
ALTER TABLE ORDER_MST ENABLE CONSTRAINT SYS_C001111;
이렇게해서 총 대량 업데이트하니 한 15분도 채 안 걸렸다!
역시 가장 효율적인 방법을 찾아 공부하고 구현하는 게 바로 백엔드 개발의 묘미이지 않을까 싶다.