복붙노트

[SPRING] postgresql 쿼리에 대한 큰 ResultSet

SPRING

postgresql 쿼리에 대한 큰 ResultSet

postgresql 데이터베이스의 테이블에 대해 쿼리를 실행하고 있습니다. 데이터베이스가 원격 시스템에 있습니다. 테이블에는 postgresql 분할 기능을 사용하는 약 30 개의 하위 테이블이 있습니다.

쿼리는 약 180 만 행 정도의 큰 결과 집합을 반환합니다.

내 코드에서는 jdbcTemplate.query라는 스프링 jdbc 지원을 사용하지만 RowCallbackHandler가 호출되지 않습니다.

내 최고의 추측은 postgresql jdbc 드라이버 (나는 8.3-603.jdbc4 버전을 사용한다)가 내 코드를 호출하기 전에 메모리에 결과를 축적하고 있다는 것이다. fetchSize 구성이 이것을 제어 할 수 있다고 생각했지만 시도했지만 아무것도 변경되지 않았습니다. 나는 postgresql 매뉴얼을 추천했다.

Oracle XE를 사용할 때이 쿼리는 정상적으로 작동했습니다. 하지만 Oracle XE에서는 사용할 수없는 파티셔닝 기능 때문에 postgresql로 마이그레이션하려고합니다.

내 환경 :

해결법

  1. ==============================

    1.커서를 사용하여 데이터를 검색하려면 반입 크기 설정 이외에 ResultSet.TYPE_FORWARD_ONLY (기본값)의 ResultSet 유형을 설정하고 자동 반입을 false로 설정해야합니다. 연결 한 문서에서 해당 참조가 언급되었지만 명시 적으로 언급하지 않았다.

    커서를 사용하여 데이터를 검색하려면 반입 크기 설정 이외에 ResultSet.TYPE_FORWARD_ONLY (기본값)의 ResultSet 유형을 설정하고 자동 반입을 false로 설정해야합니다. 연결 한 문서에서 해당 참조가 언급되었지만 명시 적으로 언급하지 않았다.

    PostgreSQL의 파티션 구성에주의하십시오. 그것은 실제로 옵티마이 저로 매우 끔찍한 일을하고, (데이터의 특성에 따라) 거대한 성능 문제를 야기 할 수 있습니다. 어떤 경우에도 행이 1.8M 행입니까? 적절히 색인 된 경우에만 크기에 따라 분할해야 할 이유가 없습니다.

  2. ==============================

    2.나는 동시에 1.8M 행을 필요로하는 앱의 클라이언트가 하나도 없다고 확신한다. 결과를 더 작은 조각으로 나누어 사용자가 반복 할 수있는 합리적인 방법을 생각해야합니다.

    나는 동시에 1.8M 행을 필요로하는 앱의 클라이언트가 하나도 없다고 확신한다. 결과를 더 작은 조각으로 나누어 사용자가 반복 할 수있는 합리적인 방법을 생각해야합니다.

    이것이 바로 Google이하는 일입니다. 검색을 수행 할 때 수백만 건의 조회가있을 수 있지만 첫 페이지에서 원하는 것을 찾을 수 있다는 생각으로 한 번에 25 페이지를 반환합니다.

    클라이언트가 아니며 결과가 어떤 식 으로든 마사지되는 경우 데이터베이스에서 모든 행을 정리하고 결과를 반환하는 것이 좋습니다. 중간 계층에서 계산을 수행하기 위해 1.8M 행을 반환하는 것은 의미가 없습니다.

    이들 중 어느 것도 적용되지 않는다면, 당신은 진짜 문제가 있습니다. 그것을 재고 할 시간.

    나중에 응답을 읽은 후에는 이것이 일괄 처리되거나 실시간으로 계산되어 트랜잭션 시스템의 일부가 아닌 테이블에 저장되어야하는보고 솔루션에 가깝습니다. 이동 평균 계산을 위해 중간 계층에 1.8M 행을 배치하는 방법은 없습니다.

    나는 방향 전환을 권장합니다.보고 솔루션으로 생각하기 시작하십시오.

  3. ==============================

    3.fetchSize 속성은 postgres 매뉴얼에서 설명한대로 작동합니다.

    fetchSize 속성은 postgres 매뉴얼에서 설명한대로 작동합니다.

    내 실수는 준비된 문에 의해 사용되는 연결이 아닌 연결 풀에서 연결에 자동 커밋 = false를 설정한다는 것이 었습니다.

    모든 피드백에 감사드립니다.

  4. ==============================

    4.위의 모든 작업을 수행했지만 마지막 부분이 필요했습니다. 호출이 트랜잭션에 래핑되었는지 확인하고 트랜잭션을 읽기 전용으로 설정하여 롤백 상태가 필요하지 않도록하십시오.

    위의 모든 작업을 수행했지만 마지막 부분이 필요했습니다. 호출이 트랜잭션에 래핑되었는지 확인하고 트랜잭션을 읽기 전용으로 설정하여 롤백 상태가 필요하지 않도록하십시오.

    나는 이것을 추가했다 : @Transactional (readOnly = true)

    건배.

  5. from https://stackoverflow.com/questions/827110/large-resultset-on-postgresql-query by cc-by-sa and MIT license