본문 바로가기

개발하면서

spring batch jdbc repository 로그 삭제 (속도 문제)

반응형

spring batch jdbc repository를 사용하면

로그를 기록하기 위한 테이블이 생성이 됩니다.

 

BATCH_STEP_EXECUTION_CONTEXT
BATCH_STEP_EXECUTION

BATCH_JOB_EXECUTION_CONTEXT
BATCH_JOB_EXECUTION_PARAMS
BATCH_JOB_EXECUTION
BATCH_JOB_INSTANCE

 

1분단위로 배치를 수행하는 JOB이 있다면,  각각의 테이블에 쌓이는 데이터의 양이 상당하다.

그래서, 데이터를 주기적으로 삭제 하기로 하였습니다.

 

-- 특정일자 이후 이력 삭제
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT WHERE STEP_EXECUTION_ID IN ( SELECT STEP_EXECUTION_ID FROM BATCH_STEP_EXECUTION WHERE START_TIME < '20230201' );

DELETE FROM BATCH_STEP_EXECUTION WHERE START_TIME < '20230201';

DELETE FROM BATCH_JOB_EXECUTION_CONTEXT WHERE JOB_EXECUTION_ID in  ( SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION where CREATE_TIME < '20230201');

DELETE FROM BATCH_JOB_EXECUTION_PARAMS WHERE JOB_EXECUTION_ID in  ( SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION where CREATE_TIME < '20230201');

DELETE FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < '20230201';

DELETE FROM BATCH_JOB_INSTANCE A WHERE NOT EXISTS ( SELECT JOB_INSTANCE_ID FROM BATCH_JOB_EXECUTION B WHERE A.JOB_INSTANCE_ID = B.JOB_INSTANCE_ID );

 

하지만, 데이터가 많다면  "BATCH_JOB_EXECUTION" 을 삭제하는 과정에서 상당한 시간 ( Full Scan ) 이 소요되어 운영중인 시스템에서는 Lock 발생 우려 때문에 사용이 불가 하다.

 

이것은

"BATCH_JOB_EXECUTION" 의 "JOB_EXECUTION_ID" 가 Foreign Key로 

"BATCH_STEP_EXECUTION, BATCH_JOB_EXECUTION_CONTEXT, BATCH_JOB_EXECUTION_PARAMS" 3개의 테이블에 설정이 되어 있기 때문에

 

"BATCH_JOB_EXECUTION"  데이터 삭제 시 정합성을 위해서  "BATCH_STEP_EXECUTION, BATCH_JOB_EXECUTION_CONTEXT, BATCH_JOB_EXECUTION_PARAMS" 3개의 테이블의 데이터를 Full Scan 하기 때문이다....

 

이 문제를 해결하기 위해서 Foreign Key로 설정된 테이블에 index를 추가하여서 삭제 속도를 향상 시켰다.

 

CREATE INDEX BATCH_STEP_EXECUTION_IDX1 ON BATCH_STEP_EXECUTION (JOB_EXECUTION_ID);
CREATE INDEX BATCH_JOB_EXECUTION_CONTEXT_IDX1 ON BATCH_JOB_EXECUTION_CONTEXT (JOB_EXECUTION_ID);
CREATE INDEX BATCH_JOB_EXECUTION_PARAMS_IDX1 ON BATCH_JOB_EXECUTION_PARAMS (JOB_EXECUTION_ID);

 

반응형