• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

fetchSize 관련 질문

22.01.09 23:03 작성 조회수 1.82k

0

안녕하세요!

fetchSize에 관련하여 질문이 있습니다.

Cursor기반에서 설명해주신 부분을 이해한 바로는 Cursor기반은 기본적으로 데이터를 하나씩 가져오는데 fetchSize를 사용하면 해당 fetSize크기만큼 한번에 땡겨올 수 있다 정도로 이해했습니다.

10:34 초에 보면 Paging기반인데도 fetchSize를 사용하고 있는 부분이 있어서 다소 혼동되어 질문드리게 되었습니다.

Paging기반은 애초에 PageSize만큼 데이터를 땡겨오는데 fetchSize를 사용하는 이유가 뭔가요?

 

답변 1

답변을 작성해보세요.

1

네 

해당 api 의  주석을 보니 이렇게 설명이 되어 있습니다.

" fetchSize 는 ResultSet 객체에 더 많은 행이 필요할 때 데이터베이스에서 가져와야 하는 행 수에 대한 힌트를 JDBC 드라이버에 제공합니다. 지정된 페치 크기가 0이면 JDBC 드라이버는 값을 무시합니다. "

Cursor 방식과 Paging 방식의  ItemReader 소스를 들여다 보면 결국 PreparedStatement 의 속성인  fetchSize 를 호출하고 있습니다.

즉 fetchSize 의 본연의 목적은 DB 에서 데이터를 행단위로 가지고 올 때 크기를 설정하는 역할이기 때문에 Cursor 이든 Paging 이든 근본적인 개념은 동일하다고 봅니다.

JdbcCursorItemReader

protected void applyStatementSettings(PreparedStatement stmt) throws SQLException {
if (fetchSize != VALUE_NOT_SET) {
stmt.setFetchSize(fetchSize);
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
}
if (maxRows != VALUE_NOT_SET) {
stmt.setMaxRows(maxRows);
}
if (queryTimeout != VALUE_NOT_SET) {
stmt.setQueryTimeout(queryTimeout);
}
}

 

JdbcPagingItemReader

protected void applyStatementSettings(Statement stmt) throws SQLException {
int fetchSize = getFetchSize();
if (fetchSize != -1) {
stmt.setFetchSize(fetchSize);
}
int maxRows = getMaxRows();
if (maxRows != -1) {
stmt.setMaxRows(maxRows);
}
DataSourceUtils.applyTimeout(stmt, getDataSource(), getQueryTimeout());
}

 

보시면 두 Reader 모두 statement 에 fetchSize 를 설정하고 있습니다.

물론 내부적으로 처리하는 방식은 다를 것이지만 fetchSize 만큼 행단위로 데이터를 조회하도록 설정하는 것은 동일하다고 봅니다.

다만 paging  방식의 Reader 는 커서 개념이 아닌 페이지 단위로 분할해서 처리하는 방식이라서 만약 pageSize 와 fetchSize 가 동일하다면 둘의 차이에 큰 의미가 없을 수 있습니다.

근데 fetchSize 와 pageSize 가 다를 경우 DB 에 따라 차이가 있겠지만 내부적으로 pageSize 만큼 분할 처리가 완료된 이후 fetchSize 만큼 행단위로 읽어오는 식으로 처리가 이루어질 수도 있습니다.

그리고 거기에 따라서 성능적 차이가 발생할 수도 있습니다.

개인적으로는 특별한 이유가 없으면 chunkSize, pageSize, fetchSize 를 가급적 동일하게 설정해서 사용하는 것을 권장해 드립니다.

이건 사실 저도 정확하게 테스트 해 본 것은 아니라서 정답을 드릴 수는 없지만 중요한 것은 fetchSize 와 pageSize 의 기본 개념을 명확하게 구분해서 알고 있으면 될 것 같습니다.