2017-04-20 5 views
2

저는 Postgres 9.4.7을 가지고 있고 큰 테이블 ~ 100M 행과 20 개의 열을 가지고 있습니다. 테이블 쿼리는 1.5k 셀렉트, 150 인서트 및 분 당 300 업데이트, 삭제는 없습니다. 여기 내 자동 진공의 설정입니다 :큰 테이블 진공 청소기를 사용하는 PostgreSQL

autovacuum_analyze_scale_factor 5000
autovacuum_vacuum_scale_factor 0
autovacuum_vacuum_threshold 0
autovacuum_analyze_threshold 5000
autovacuum_max_workers 내 경우 데이터베이스에서 5 초는

진공 청소기의 지속적인 상태에 거의 항상 6
autovacuum_naptime. 하나의 vacuuming 세션이 끝나면 다른 세션이 시작됩니다.

그래서 중요한 질문 : 대형 테이블을 진공 청소할 수있는 일반적인 방법이 있습니까?

다음은 몇 가지 다른 질문입니다.

표준 진공은 전체 테이블을 스캔하지 않으며 '분석'은 30k 행만 스캔합니다. 그래서 같은 부하에서 일정한 실행 시간을 가져야합니다. 사실입니까? 정말 테이블을 분석해야합니까? 대형 테이블에 대한 쿼리 계획에서 유용한 '변경'을 자주 '분석'할 수 있습니까?

+0

당신은 9.6을 가지고 있습니까? 그렇지 않다면 '표준 진공은 전체 테이블을 스캔하지 않습니다'는 false입니다 –

답변

1

진공

VACUUM 죽은 튜플에 의해 점유 된 스토리지를 회수합니다.

따라서 영향받는 페이지 만 변경되지만 전체 테이블을 검사합니다.

당신은 아마도 "표준 진공"이라고 부릅니다. 지금 당신은

해당 데이터의

양을 분석

진공 가시성 맵에 기초하여 페이지를 건너 뛰고 다음, 9.6이있는 경우 ANALYZE 스캔 테이블 크기에 dependsdefault_statistics_targetset per instance 또는 당 테이블 - 30K 그 자체가 아닙니다 :

대용량 테이블의 경우 ANALYZE 은 실제 테이블 내용이 변경되지 않았더라도 ANYYZE 이 실행될 때마다 약간의 변화가있는 모든 행을 검사하는 대신 테이블 내용의 무작위 샘플을 사용합니다. 이 은 일 수 있으며 계획가의 예상 비용은으로 약간 변경됩니다 ( 설명).

그래서 그렇지 않으면 너무 자주 계획을 변경할 수있는 더 많은 기회를 가지고 분석,

alter table ... alter COLUMN ... set STATISTICS 200; 

또는 default_statistics_target 증가 등의 실행 떨어지게을 EXPLAIN 더 안정적인 결과를 원하는 경우.

한 가지 더 - 5K 임계 값이 있습니다. 100000K 행을 가진 테이블에서 0.002 % - 맞습니까? 그래서 규모는 0.00002입니까? 0.2 또는 0.1의 기본값 하나는 ... 너무 낮게 임계 값을 가질 수도 있습니다. 진공 청소를 자주하는 것이 좋습니다.하지만 여기서는 너무 자주 보입니다. 천 번 더 자주 그런 다음 기본적으로 될 것입니다 ...