2012-03-13 3 views
4

다가오는 프로젝트에서 다양한 MVCC 가능 데이터베이스를 고려 중이며 PostgreSQL이 내 레이더에 들어 왔습니다.PostgreSQL Vacuum을 1 ~ 2 분마다 실행할 수 있습니까?

  1. 는 데이터베이스의 현재 버전에서 몇 가지 정보를 읽어 데이터를 80 ~ 90 %로 수정 한에 다시 쓰거나 : 내 프로그램의

    요구 사항은 대략 다음과 같은 순서를 포함 더 많은 거래 (과거와 현재 상태가 모두 필요한 Conway의 Game of Life에서 그리드 업데이트와 같은 것을 상상해보십시오).

  2. 대기 완료 후 1-2 분. 이 시간 동안 클라이언트는 새 데이터에 대해 읽음을 발행 할 수 있습니다.

  3. 반복.

데이터베이스의 크기는 2-4GB로 제한됩니다.

~ 90 %의 변경 사항은 기존 개체의 업데이트로, ~ 5 %는 새 개체가되고 ~ 5 %는 삭제 된 개체가됩니다.

제 질문은 평범한 VACUUM 명령을 1 ~ 2 분에 한 번씩 1.5 단계로 실행하고 매번 2-3 ~ GB의 변경 사항을 PostgreSQL에서 자동으로 처리 할 수 ​​있습니까?

+5

아마 수동으로 실행할 필요는 없습니다. 특정 테이블에 대한 자동 진공 설정을 조정하면 충분합니다. 그러나 진공은 많은 수의 행을 삭제하거나 삽입 할 때만 필요합니다. 업데이트에는 그러한 공격적인 공백이 필요하지 않습니다. –

+0

필자가 알고있는 모든 업데이트는 새로운 XID를 사용하여 새 레코드를 생성하기 때문에 각주기마다 개체의 80-90 %를 업데이트하므로 많은 "오래된"레코드를 정리해야합니다. – MindJuice

+0

단계 1이 실행되는 동안 클라이언트가 단계 "0"에서 데이터베이스의 "이전"상태에 대한 읽기를 발행 할 수도 있으므로 새 레코드가있는 동안 이전 레코드를 사용할 수 있어야합니다. 생성됩니다. – MindJuice

답변

5

필자는 Postgres가이 시나리오에서 문제가 없어야한다고 생각합니다. 이 시나리오는 거대한 업데이트 사이의 수동 진공이 합리적인 선택처럼 보일 정도로 흔하지 않습니다.

거대한 업데이트 대신 새 테이블 집합을 생성하고 분석 한 다음 (필요하다면) 트랜잭션 ddl을 사용하여 이전 테이블을 삭제하고 새 테이블의 이름을 바꿀 수 있는지 고려하십시오. 그들의 장소로 사람. 이렇게하면 진공에 대한 걱정을 덜어 줄 수 있습니다.

그런 시나리오에서는 심각한 조정을해야합니다. 특히 shared_buffers, checkpoint 관련 매개 변수 및 vacuum 관련 매개 변수를 살펴보십시오. 또한 현실적인 작업 부하로 벤치마킹하는 것에 유의하십시오.

+0

두 개의 개별 테이블을 사용하고 끝에 이름을 바꾸는 것에 대한 흥미로운 제안. 그것은 저를 위해 다만 작동 할지도 모르다. 나는 이것을 조금 생각할 것이다. 감사! – MindJuice

+0

테이블의 이름을 바꾸려면 데이터베이스에서 먼저 테이블을 잠 가야합니다. 이것은 업데이트를위한 일반적인 행 잠금보다 훨씬 느립니다. –

+1

@FrankHeikens : 이것은 절충안입니다. OP는 거의 모든 테이블을 업데이트하려고합니다. 간단한 독점 잠금은 VACUUM 및 물건을 다루는 것보다 쉽게 ​​좋을 수 있습니다. 독자가 짧은 검색어 만 발행하는 경우 특히 그렇습니다. 또는 작은 search_path 춤은 "오래된"독자가 이전 스키마의 테이블을 사용하고 새로운 독자는 새로운 스키마의 테이블을 사용하며 백그라운드에서는 다른 버전을 준비하는 것을 의미 할 수 있습니다. 그런 다음 더 이상 다른 사람이 사용하지 않는 스키마를 삭제합니다. – maniek

관련 문제