9.1 미만의 일반 VACUUM ANALYZE가 여전히 권장됩니까?


38

우분투에서 PostgreSQL 9.1을 사용하고 있습니다. 예정 VACUUM ANALYZE여전히 권장, 또는 모든 필요 돌봐 자동 진공 정도입니까?

대답이 "의존"이라면,

  • 지연 데이터베이스 (30 GiB 압축 덤프 크기, 200 GiB 데이터 디렉토리)가 있습니다
  • 데이터베이스에 ETL을 사용하여 주당 약 3 백만 행을 가져옵니다.
  • 가장 자주 변경되는 테이블은 모두 마스터 테이블에 데이터가없는 마스터 테이블에서 상속됩니다 (데이터는 주 단위로 분할 됨)
  • 시간별 롤업을 작성하고 거기서 매일, 매주 및 매월 보고서를 작성합니다.

예정된 일정 VACUUM ANALYZE이보고에 영향을 미치기 때문에 묻습니다 . 5 시간 이상 실행되며, 정기적 인 데이터베이스 가져 오기에 영향을 미치므로 이번 주에 두 번 중단해야했습니다. check_postgres데이터베이스에 심각한 부풀림을보고하지 않으므로 실제로 문제가되지 않습니다.

문서에서 autovacuum은 트랜잭션 ID 랩도 처리해야합니다. 질문은 : 나는 여전히 필요 VACUUM ANALYZE합니까?


글쎄, 나는 '아니오'라고 말하지만,이 답변을 정교화하려면 (예를 들어 autovacuum 매개 변수 설정) 복제본 DB에 대한 실험이 필요합니다.
dezso 2016 년

답변:


32

VACUUM은 임시가 아닌 테이블에서 업데이트되거나 삭제 된 행에만 필요합니다. 분명히 많은 INSERT를하고 있지만 설명이나 많은 UPDATE 또는 DELETE를하고 있다는 것은 분명하지 않습니다.

이러한 작업은 pg_stat_all_tables보기, 특히 n_tup_updn_tup_del열을 통해 추적 할 수 있습니다 . 또한 요점까지는 n_dead_tup테이블 당 진공 청소기로 청소해야하는 행 수를 알려주 는 열이 있습니다. ( 통계 수집과 관련된 기능 및보기는 문서에서 통계 모니터링을 참조하십시오 ).

귀하의 경우 가능한 전략은 예약 된 VACUUM을 억제 하고이 견해를 주시하고 어느 테이블이 n_dead_tup크게 올라가고 있는지 확인하는 것입니다. 그런 다음이 테이블에만 공격적인 VACUUM을 적용하십시오. 행이 삭제되거나 업데이트되지 않는 큰 테이블이 있고 공격적인 VACUUM이 작은 테이블에서만 실제로 필요한 경우에는이 방법이 유리합니다.

그러나 옵티마이 저가 항상 새로운 통계를 갖도록 ANALYZE를 계속 실행하십시오.


4
Autovacuum은 ANALYZE도 관리합니다. 대량 UPDATE / INSERT / DELETE 사이에서 큰 쿼리를 즉시 따르는 수동 ANALYZE를 실행하는 것이 좋습니다. 그래도 좋은 조언은 +1입니다.
Erwin Brandstetter

n_dead_tup 및 친구를 가리키는 포인터에 감사드립니다. 롤업 테이블에 자주 (시간당) 수천 개의 행을 삭제하고 다시 만듭니다. 값을 확인하고 적절하게 예약합니다. 대답은 : 항상 어쨌든 "모니터, 생각, 행동"입니다
프랑수아 보 솔레이

25

나는 당신의 질문에 autovacuum돌보지 않을 것이 아무것도 없습니다 . 그것은 주로 작문 활동패턴에 달려 있습니다. 당신은 300 만 언급 새로운 주 당 행하지만,을 INSERT(나 COPY) 일반적으로 테이블 및 인덱스 팽창을 작성하지 않습니다. ( autovacuum단 처리 소요하는 열 통계가시성지도 와 약간의 작업을). UPDATEDELETE임의 행을 대상으로 특히, 테이블 및 인덱스 팽창의 주된 원인이다. 귀하의 질문에 해당 내용이 없습니다.

autovacuumPostgres 9.1 이상에서 큰 성과를 거두었습니다. autovacuum설정을 살펴볼 것 입니다. 진공 청소가 작업 부하를 방해하는 경우 "비용 기반 진공 지연" 도 살펴보십시오 . 수동 진공 청소는 드문 예외입니다.

임의의을 많이 가진 경우 HOT 업데이트를 즉시 허용하고의 필요성을 줄이기 위해를 100보다 낮은 값 UPDATE으로 설정할 FILLFACTOR수 있습니다 VACUUM. HOT 업데이트에 대한 추가 정보 :

또한 임시 테이블 에는 manual VACUUM& 가 필요합니다 ANALYZE. 나는 매뉴얼을CREATE TABLE 인용 한다 :

자동 진공 데몬 에 액세스 할 수 없습니다, 따라서 진공 또는 임시 테이블을 분석 할 수 없습니다. 따라서 세션 SQL 명령을 통해 적절한 진공 및 분석 작업을 수행해야합니다. 예를 들어 임시 테이블을 복잡한 쿼리 ANALYZE에 사용하려는 경우 임시 테이블을 채운 후 임시 테이블 에서 실행하는 것이 좋습니다 .


6

데이터베이스 전체를 실행하는 대신 자동 기능을 사용하는 것이 가장 좋다는 데 동의하지만 대부분의 경우 테이블 당 튜닝이 필요합니다.

나는 진공과 분석을 함께 묶기 위해 postgres의 디자인 선택에 동의하지 않습니다. 삽입 / 업데이트가 많지만 삭제가 거의없는 데이터베이스가 분석을 수행하지 못하고 성능이 좋지 않은 데이터베이스가있는 몇 가지 사례를 보았습니다.

해결 방법은 많이 사용되는 테이블로 이동하여 큰 쿼리를 수행하고 해당 테이블에 대한 자동 분석 설정을 한 번 또는 격일로 분석되는 위치로 설정하는 것입니다.

자동 진공 탭의 GUI에서 테이블 당 설정으로 이동할 수 있으며 진공과 독립적으로 설정할 수있는 분석 설정이 표시됩니다.

설정은 reloptions 테이블에서 끝나고 쿼리에서 볼 수 있습니다

SELECT c.relname, c.reloptions FROM pg_class c where reloptions is not null

공격적인 분석의 샘플 값은

{autovacuum_enabled=true,autovacuum_analyze_threshold=10,autovacuum_analyze_scale_factor=.01}

마지막으로 테이블에서 자동 분석 쿼리를받은 시간을 확인하려면

select 
    relname, 
    n_dead_tup, 
    n_tup_ins, 
    n_tup_upd, 
    n_tup_del, 
    last_autoanalyze, 
    autoanalyze_count 
from pg_stat_user_tables 
where last_autoanalyze is not null 
order by last_autoanalyze desc;

2
그렇지 않은 경우 ANALYZEPostgreSQL은 통계가 변경되었음을 어떻게 알 수 있습니까? 그리고 ANALYZE시간이 오래 걸린다 는 것을 어떻게 알 수 있습니까? 동시에 위에서 언급 한 GUI가 확실하지 않지만 특정 테이블 당 설정이 유용 할 수 있습니다.
dezso 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.