2011-01-26 2 views
0

다음은 직장에서 솔루션을 연구하는 시나리오입니다. 우리는 네트워크에서 발생하는 이벤트를 저장하는 테이블을 포스트그레스에 가지고 있습니다. 현재 작동하는 방식은 네트워크 이벤트가 발생할 때 행을 삽입하는 동시에 특정 타임 스탬프와 일치하는 오래된 레코드를 삭제하여 테이블 크기를 약 10,000 개의 레코드로 제한합니다. 기본적으로 로그 회전과 비슷한 개념입니다. 한 번에 수천 개의 네트워크 이벤트가 발생하므로 트랜잭션 속도가 너무 높아서 성능 저하가 발생합니다. 서버가 충돌하거나 매우 느려지는 경우 고객은 테이블 크기를 최대 100 만 개까지 유지해야합니다. 이는 성능 저하를 가속화 할 것이고 (특정 타임 스탬프와 일치하는 레코드를 삭제하지 않으면 안되기 때문에) 공간 관리 문제가 발생합니다. 간단한 JDBC를 사용하여 테이블을 읽고 쓰는 중이다. 기술 커뮤니티가이 테이블에서 삽입 및 삭제를 처리하는 더 나은 방법을 제안 할 수 있습니까?효율적인 데이터베이스 작업

+1

여기에 크기에 숫자가 있습니까? 10 만 건 또는 2 백만 건의 기록 자체는 거의 없습니다. 매 초 200 만 개의 기록이 파열되면 시간이 지남에 200 만 개가 넘는 것은 아닙니다. 또한 인덱스를 포함하여이 테이블에 대한 DB 스키마를 제공하고 개선을 제안하는 데 도움이되는 일반적인 쿼리를 제공하십시오. – nos

답변

4

필자는 아마도 10x 총 원하는 크기의 파티션 테이블을 사용하여 최신 파티션에 삽입하고 가장 오래된 파티션을 삭제할 것이라고 생각합니다.

http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html

이 쿼리보다 훨씬 작고 삭제 "오래된이 떨어지고"에 부하한다.

업데이트 : Nos의 의견에 동의하지만 삽입/삭제가 병목 현상이 아닐 수 있습니다. 어쩌면 먼저 조사를 해보십시오. 당신이 시도 할 수

+0

하루 24 시간마다 1 파티션으로 24 개의 파티션으로 해결할 것입니다. 그리고 TRUNCATE가 VACUUM을 필요로하지 않기 때문에 비울 수있는 파티션에서 TRUNCATE를 사용하십시오. –

+0

빠르고 도움이되는 답변에 감사드립니다. 지난 주에 막 시작 했으므로 DB 스키마, 인덱스 및 쿼리에 대해 더 자세히 조사하고 병목 현상이 될 수있는 부분에 대해 자세히 조사하고 곧 모든 세부 정보를 게시합니다. – alwaysLearning

0

어떤 것들은 - 로그에

  • 쓰기, 별도의 배치 PROC 있습니다. 테이블에 써라.
  • 쓰기를 그대로 유지하거나 정기적으로 또는 트래픽이 적을 때 삭제합니다.
  • 버퍼에서 실제 db 쓰기가 발생하면 버퍼/캐시에 쓰기를 수행하십시오.

몇 가지 일반적인 제안 -

당신은 타임 스탬프에 따라 삭제하는 때문에
  • , 타임 스탬프 색인되어 있는지 확인하십시오. 카운터/자동 증가 된 rowId (예 : id < currentId -1000000)를 삭제할 수도 있습니다.
  • 또한 JDBC 배치 쓰기는 개이며 개별 행 쓰기보다 빠릅니다 (쉽게 속도 향상이 가능합니다). 쓰기를 버퍼링 할 수 있다면 한번에 100 행을 일괄 적으로 쓰면 커다란 도움이 될 것입니다.
관련 문제