문제

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

쿼리는 대규모 결과 세트, 약 180 만 행을 반환합니다.

내 코드에서 Spring JDBC 지원, 메소드를 사용합니다. jdbctemplate.query, 하지만 나의 RowCallbackHandler 호출되지 않습니다.

가장 좋은 추측은 PostgreSQL JDBC 드라이버 (버전 8.3-603.jdbc4)가 코드를 호출하기 전에 메모리에 결과를 축적하고 있다는 것입니다. 나는 생각했다 페치 크기 구성 이것을 제어 할 수는 있지만 시도해 보았고 아무것도 변경하지 않았습니다. 나는 이것을 postgresql 매뉴얼로했다 추천.

이 쿼리는 내가 Oracle XE를 사용했을 때 잘 작동했습니다. 그러나 나는 Oracle XE에서 사용할 수없는 파티션 기능으로 인해 PostgreSQL로 마이그레이션하려고합니다.

내 환경 :

  • Postgresql 8.3
  • Windows Server 2008 Enterprise 64 비트
  • JRE 1.6 64 비트
  • 봄 2.5.6
  • PostgreSQL JDBC 드라이버 8.3-603
도움이 되었습니까?

해결책

커서를 사용하여 데이터를 검색하려면 resultset 유형의 resultset 유형을 설정해야합니다. yource_forward_only (기본값)와 Fetch 크기를 설정하는 것 외에도 자동 커미트를 False로 설정해야합니다. 그것은 당신이 링크 한 문서에서 참조되지만 당신은 그 단계를 수행했다고 명시 적으로 언급하지 않았습니다.

PostgreSQL의 파티셔닝 체계에주의하십시오. 그것은 최적화기로 실제로 매우 끔찍한 일을하며 (데이터의 세부 사항에 따라) 대규모 성능 문제를 일으킬 수 있습니다. 어쨌든 당신의 행은 1.8m 정도 밖에되지 않습니까? 적절하게 인덱싱된다는 점을 감안할 때 크기만으로 분할해야 할 이유가 없습니다.

다른 팁

나는 앱의 단일 클라이언트가 동시에 1.8m 줄이 필요한 것입니다. 결과를 더 작은 조각으로 청소하고 사용자에게 반복 할 수있는 기회를 제공하는 현명한 방법을 생각해야합니다.

그것이 Google이하는 일입니다. 검색을 할 때 수백만 번의 히트가있을 수 있지만 첫 페이지에서 원하는 것을 찾을 수 있다는 아이디어로 한 번에 25 페이지를 반환합니다.

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

그 중 어느 것도 적용되지 않으면 실제 문제가 있습니다. 그것을 다시 생각할 시간입니다.

이후의 응답을 읽은 후에는 저에게 소리가 나는 것처럼 들립니다. 이것은 배치로 크 런치를 띠거나 실시간으로 계산하고 거래 시스템의 일부가 아닌 테이블에 저장 해야하는보고 솔루션입니다. 이동 평균을 계산하기 위해 1.8m 줄을 중간 계층으로 가져 오는 방법은 없습니다.

직접 재배치하는 것이 좋습니다.보고 솔루션으로 생각하기 시작하십시오.

Fetchsize 속성은 다음과 같이 작동했습니다 Postgres 매뉴얼.

내 실수는 준비된 명령문에서 사용하는 연결이 아닌 연결 풀의 연결에 Auto Commit = False를 설정하고 있다는 것입니다.

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

위의 모든 작업을 수행했지만 마지막 조각이 필요했습니다. 호출이 트랜잭션에 싸여 있는지 확인하고 트랜잭션을 읽도록 설정하여 롤백 상태가 필요하지 않도록하십시오.

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

건배.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top