diff --git a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin index e19103a..25259f0 100644 Binary files a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin and b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock index 223629d..ec42d57 100644 Binary files a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock and b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin index 680ac1d..1b5b6ba 100644 Binary files a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin and b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock index 6756bd9..573640e 100644 Binary files a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock and b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin b/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin index 9cf4d77..7893927 100644 Binary files a/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin and b/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin differ diff --git a/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 381a11a..a90951f 100644 Binary files a/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/gukyuin/status-update/.gradle/file-system.probe b/gukyuin/status-update/.gradle/file-system.probe index 4085ab2..821a02f 100644 Binary files a/gukyuin/status-update/.gradle/file-system.probe and b/gukyuin/status-update/.gradle/file-system.probe differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class index 334952a..d667090 100644 Binary files a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class index e5a6f5f..1275735 100644 Binary files a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class index 5715eb0..a7061c7 100644 Binary files a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class index 166f06f..6f48101 100644 Binary files a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class differ diff --git a/gukyuin/status-update/build/libs/status-update.jar b/gukyuin/status-update/build/libs/status-update.jar index e627ccb..d5ecf88 100644 Binary files a/gukyuin/status-update/build/libs/status-update.jar and b/gukyuin/status-update/build/libs/status-update.jar differ diff --git a/gukyuin/status-update/build/reports/problems/problems-report.html b/gukyuin/status-update/build/reports/problems/problems-report.html index 3505134..5995716 100644 --- a/gukyuin/status-update/build/reports/problems/problems-report.html +++ b/gukyuin/status-update/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin b/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin index d52a3c3..3934d83 100644 Binary files a/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin and b/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java index 73b4110..dc73dea 100644 --- a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java @@ -1,9 +1,11 @@ package com.kamco.cd.kamcoback.postgres.core; import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinPnuCntUpdateJobRepository; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @Service public class GukYuinPnuCntUpdateJobCoreService { @@ -23,4 +25,14 @@ public class GukYuinPnuCntUpdateJobCoreService { public void updateGukYuinApplyStatus(String uid, String status) { gukYuinPnuCntUpdateRepository.updateGukYuinApplyStatus(uid, status); } + + public long[] findGeoUidRange(String uid) { + return gukYuinPnuCntUpdateRepository.findGeoUidRange(uid); + } + + public int updateRangeBatch(long start, long end, int batchSize, int loop) { + int updated = gukYuinPnuCntUpdateRepository.updateRangeBatch(start, end, batchSize); + log.info("PNU batch loop={}, range=[{},{}], updated={}", loop, start, end, updated); + return updated; + } } diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java index 0940243..c369e9f 100644 --- a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java @@ -5,4 +5,8 @@ public interface GukYuinPnuCntUpdateJobRepositoryCustom { int updateGukYuinContListPnuUpdateCnt(); void updateGukYuinApplyStatus(String uid, String status); + + long[] findGeoUidRange(String uid); + + int updateRangeBatch(long startGeoUid, long endGeoUid, int batchSize); } diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java index cb8ee44..ee4a71e 100644 --- a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java @@ -1,5 +1,6 @@ package com.kamco.cd.kamcoback.postgres.repository.gukyuin; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -49,4 +50,60 @@ public class GukYuinPnuCntUpdateJobRepositoryImpl .where(mapSheetLearnEntity.uid.eq(uid)) .execute(); } + + @Override + public long[] findGeoUidRange(String uid) { + Long analUid = + queryFactory + .select(mapSheetAnalInferenceEntity.id) + .from(mapSheetLearnEntity) + .innerJoin(mapSheetAnalInferenceEntity) + .on(mapSheetLearnEntity.id.eq(mapSheetAnalInferenceEntity.learnId)) + .where(mapSheetLearnEntity.uid.eq(uid)) + .fetchOne(); + + if (analUid != null) { + String sql = + """ + select min(gt.geo_uid), max(gt.geo_uid) + from tb_map_sheet_anal_inference inf + inner join tb_map_sheet_anal_data_inference dt + on(inf.anal_uid = dt.anal_uid) + inner join tb_map_sheet_anal_data_inference_geom gt + on(dt.data_uid = gt.data_uid) + where inf.anal_uid = ? + """; + + return jdbcTemplate.queryForObject( + sql, (rs, rowNum) -> new long[] {rs.getLong(1), rs.getLong(2)}, analUid); + } + return new long[0]; + } + + @Override + public int updateRangeBatch(long startGeoUid, long endGeoUid, int batchSize) { + + String sql = + """ + WITH batch AS ( + SELECT p.geo_uid + FROM tb_map_sheet_anal_data_inference_geom p + WHERE p.pnu IS DISTINCT FROM 1 + AND EXISTS ( + SELECT 1 + FROM tb_pnu tp + WHERE tp.geo_uid = p.geo_uid + ) + AND p.geo_uid >= ? + AND p.geo_uid <= ? + LIMIT ? + ) + UPDATE tb_map_sheet_anal_data_inference_geom p + SET pnu = 1 + FROM batch + WHERE p.geo_uid = batch.geo_uid + """; + + return jdbcTemplate.update(sql, startGeoUid, endGeoUid, batchSize); + } } diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java index 79a538f..6912500 100644 --- a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java @@ -91,10 +91,45 @@ public class GukYuinApiStatusJobService { log.info("[Step 5] progress 100 확인 → PNU CNT update 실행"); log.info( - "=== tb_pnu 에 insert 된 데이터 중 tb_map_sheet_anal_data_inference_geom 의 pnu (cnt)값이 다른 것 update"); - int updateCnt = gukYuinPnuCntUpdateJobCoreService.updateGukYuinContListPnuUpdateCnt(); + "=== tb_pnu 에 insert 된 데이터 중 tb_map_sheet_anal_data_inference_geom 의 pnu 값이 있는 것 1로 update"); + long[] range = gukYuinPnuCntUpdateJobCoreService.findGeoUidRange(dto.getUid()); + + long min = range[0]; + long max = range[1]; + + long rangeSize = 500000; // geo_uid 범위 + int batchSize = 10000; + + log.info("[Step 5] 회차에 geo_uid의 min, max 를 구해서 그 값만 조회해서 batchSize 만큼 Loop를 돌리게 한다."); + log.info("PNU batch start min={}, max={}", min, max); + + for (long start = min; start <= max; start += rangeSize) { + + long end = Math.min(start + rangeSize - 1, max); + + log.info("Processing range {} ~ {}", start, end); + + int loop = 0; + + while (true) { + + loop++; + + int updated = + gukYuinPnuCntUpdateJobCoreService.updateRangeBatch(start, end, batchSize, loop); + + if (updated == 0) { + break; + } + } + } + + log.info("PNU batch finished"); + + // int updateCnt = + // gukYuinPnuCntUpdateJobCoreService.updateGukYuinContListPnuUpdateCnt(); + // log.info("[Step 5] PNU CNT update 완료 updatedRows={}", updateCnt); - log.info("[Step 5] PNU CNT update 완료 updatedRows={}", updateCnt); log.info( "[Step 6] 추론 learn 테이블 apply_status={} 로 업데이트", GukYuinStatus.PNU_COMPLETED.getId()); gukYuinPnuCntUpdateJobCoreService.updateGukYuinApplyStatus(