문제
나는 현재 2 개의 인덱스와 2 억 5 천만 개의 활성 행과 대략 많은 죽은 줄 (또는 그 이상)의 테이블을 정리하고 있습니다. 클라이언트 컴퓨터 (노트북)에서 서버로 명령 VACCUM Full Analyze를 발행했습니다. 지난 3-4 일 정도의 사업에 대한 사업이 진행되고 있습니다. 나는해야 할 일이 많기 때문에 곧 끝날지 궁금합니다!
서버에는 쿼드 코드 Xeon 2.66 GHz 프로세서, 12GB 또는 RAM 및 RAID 1 구성에 2 x 10K RPM 146 GB SAS HD에 연결된 RAID 컨트롤러가 있습니다. Suse Linux를 실행하고 있습니다. 궁금...
이제 우선 진공 우체국 장 마스터 프로세스는 하나의 핵심 만 사용하는 것 같습니다. 둘째, 나는 매우 높은 I/O가 I/O 유휴 시간 비율에 쓰는 것을 보지 못합니다. 셋째, 전화로 procinfo
, 진공 과정이 대부분의 시간 (88%)이 I/0을 기다리는 것을 추정 할 수 있습니다.
그렇다면 RAID 컨트롤러를 과부하시키기 위해 스레드를 통해 더 많은 코어를 사용하지 않는 이유는 무엇입니까 (높은 I/O가 유휴 비율로 작성)? I/O 부하가 높지 않으면 왜 I/O를 기다리고 있습니까? 이 모든 전원/자원으로 손가락으로 더 빠르게 진행되지 않는 이유는 무엇입니까? 진공 청소기는 특히 거대한 테이블에서 작업하고있는 경우 유일한 일인 경우 진공이 멀티 스레드가 될 수있는 것 같습니다!
또한, PostgreSQL.conf를 구성하여 그러한 진공을 멀티 스레드하도록하는 방법은 무엇입니까? 내가 그것을 죽일 수 있고 여전히 부분 정화로부터 혜택을받을 수 있습니까? 그 테이블에서 작업해야합니다.
PostgreSQL 8.1을 사용하고 있습니다
다시 thx
해결책
당신은 어떤 버전의 PostgreSQL을 사용하고 있는지 말하지 않습니다. 8.0 이전 일 가능성이 있습니까?
나는이 똑같은 시나리오를 가졌다. 당신의 최고 :
- 진공 청소기를 죽이십시오
- pg_dump -t 옵션으로 테이블을 백업하십시오
- 테이블을 떨어 뜨립니다
- 테이블을 복원하십시오
8.x를 사용하는 경우 Autovacuum 옵션을보십시오. 진공 청소기는 단일 스레드이며 여러 스레드를 사용하도록 할 수있는 일은 없습니다.
다른 팁
몇 가지 빠른 팁 :
- 무슨 일이 일어나고 있는지 알 수 있도록 진공을 완전하게 실행하십시오.
- 진공 전에 모든 지수를 삭제하십시오. 진공 청소기보다 재건하는 것이 더 빠릅니다. 또한 진공 충만이 충분하지 않기 때문에 (특히 8.1과 같은 오래된 posgresql).
- maintenance_work_mem을 실제로 설정하십시오.
- 최신 PostgreSQL을 사용하십시오. BTW, 8.4는 진공 청소기가 크게 개선 될 것입니다.
진공의 대안은 덤프 및 복원입니다.
편집 : 9.0 진공 청소기 전체가 전체 테이블을 다시 작성합니다. 기본적으로 덤프 + 복원을 수행하는 것과 동일하므로 REINDEX를 실행하는 것은 불필요합니다.
테이블을 잠그고 진공이 작동하지 않도록 진행중인 것이 없다고 확신하십니까?
(어쨌든 사용하는 것이 가장 좋습니다 VACUUM_COST_DELAY 진공 청소기는 생산을 방해하지 않습니다.)
오래된 진공은 화석입니다. 그것은 또한 꽤 느리고 나중에 다시 린덱스를 얻었습니다. 사용하지 마십시오. 실제로 테이블을 디포하려면 클러스터를 사용하십시오.
lettssay 디스크 공간이 남아 있습니다. 덤프 및 재 장전보다 훨씬 빠릅니다.
CREATE TABLE newtable AS SELECT * FROM oldtable;
CREATE INDEX bla ON newtable( ... );
ALTER TABLE oldtable RENAME TO archive;
ALTER TABLE newtable RENAME TO oldtable;
이것은 당신의 제약 조건을 복사하지 않습니다. 당신은 창조 테이블을 사용하여 ... 복사 할 수 있습니다.
그래서 왜 스레드를 통해 더 많은 코어를 사용하지 않습니까?
PG는 이것을 지원하지 않습니다.