[Spring Batch] 복합키 상황에서의 페이징 최적화하기
· 11 min read
Spring Batch 를 사용하며 억 단위의 데이터가 존재하는 테이블을 조회할때 겪었던 문제와 해결 과정을 이야기합니다.
Environment
- Spring Batch 5.0.1
- PostgreSQL 11
Problem
대량의 데이터를 조회하기 위해 JdbcPagingItemReader
를 사용하던 중 시간이 지날수록 쿼리가 급격하게 느려지는 현상을 확인하고 자세히 코드를 살펴봅니다.
기본 동작
아래 쿼리는 PagingQueryProvider
에 의해 자동으로 생성되어 실행되는 쿼리입니다.
SELECT *
FROM large_table
WHERE id > ?
ORDER BY id
LIMIT 1000;
보시다시피 Spring Batch 에서는 JdbcPagingItemReader
를 사용할 경우 offset 을 사용하는 대신 where 절을 생성하여 paging 처리를 해줍니다. 덕분에 수억건의 데이터가 존재하는 테이블을 조회하더라도 지연없이 빠르게 읽는 것이 가능합니다.
tip
LIMIT
이 있더라도 OFFSET
은 이전 데이터를 전부 다시 읽어야 합니다. 따라서, 읽어야하는 데이터가 많아지면 많아질수록 점점 느려지게 됩니다. 자세한 정보는 게시글1을 참조해주세요.