2012-11-28 3 views
8

큰 postgres 컬렉션을 기반으로하는 페이지에 대한 페이지 생성 속도를 높이기 위해 쿼리 결과를 memcache에 캐시합니다. 그러나 매우 큰, 또는 거의 액세스 할 수없는 불변의 컬렉션에 대한 포스트 그레스 서버 쪽 커서를 저장 가능한 대체 캐싱 전략이 될 것이라고 궁금하네요.캐싱을 위해 postgres 서버 측 커서 사용

컬렉션의 중간에 페이지를 제공 한 후에 컬렉션의 다른 곳에서 "next"및 "prev"링크가 무작위 쿼리보다 훨씬 많이 사용됩니다. 쿼리의 큰 시작 비용 (피할 수없는 것처럼 보입니다)을 피하기 위해 이웃에 "WITH HOLD"커서를 사용할 수 있습니까?

서버의 리소스 소비에 대해 궁금합니다. 컬렉션이 불변 인 경우, 커서를 저장하는 데 많은 리소스가 필요하지 않지만,이 점에서 최적화 된 포스트 그레스가 얼마나 좋은지 궁금합니다. 추가 문서에 대한 링크가 있으면 감사하겠습니다.

+0

필자가 생각한 캐싱 전략은 고정 된 수의 커서를 저장하는 것입니다. 특정 검색어에 대해 가까이있는 경우 결과 페이지를 검색하는 데 사용됩니다. 그렇지 않으면 가장 오랫동안 사용하지 않은 커서가 재설정됩니다. – shaunc

답변

3

많은 문제가 발생합니다. 당신이 거라고

  • 은 동일한 사용자가 동일한 SQL 연결
  • 당신이 커서는 진공 작업을 개최합니다 정리 전략
  • 을 만들어야를 얻을 수 있도록해야합니다.
  • 연결 풀에서 커서를 지우지 않도록 설득해야합니다.
  • 아마도 언급하지 않은 다른 문제 일 수 있습니다.

간단히 말해서 :하지 마십시오. 다음/이전 페이지를 백그라운드에서 미리 계산하고 memcached에 저장하는 방법은 어떻습니까?

+0

흠 - 커서와 연결 사이의 관계를 문서의 어느 부분에서 설명 할 수 있습니까? "보류"가 없다면 커서는 트랜잭션에서만 유효하지만 트랜잭션의 커서 의존성에 대해서는 언급하지 않습니다 : http://www.postgresql.org/docs/9.2/static/sql-declare .html – shaunc

+0

UPDATE : "동일한 세션에서 후속 트랜잭션 *을 통해 계속 액세스 할 수 있습니다. *"- 한숨 ... precalc는 여전히 스캔을 복제하지만,> (마지막 PK 또는 쿼리가 정렬 된 것) 이것을 피하십시오. 승인 – shaunc

관련 문제