바쁜 테이블이 진공 청소기로 청소되지 않습니다


11

Windows에서 Postgres 9.2를 사용하여 저주파 시계열 데이터를 저장하고 있습니다. 가동 중지 시간없이 연중 무휴 24 시간마다 초당 약 2000 행을 삽입하고 있습니다. 이 DELETE일의 고정 번호로 테이블의 길이를 유지하기 위해 테이블에 매 10 분 정도를 실행합니다. 결과적으로 9 억 행이 상당히 안정적입니다. (사람들은 관심 들어, SELECT, INSERT, DELETE모든 확대됨에 있습니다).

따라서 DELETE행을 삭제해도 디스크 공간이 확보되지 않습니다. 이를 위해 우리는 VACUUM실행 해야 합니다.

나는 묻습니다했습니다 pg_stat_user_tablesVACUUM하지 지금까지 실행 한 것으로 나타납니다.

다양한 문서에서 이해하는 내용 ( http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html ) :

  • 자동 진공 기능이 켜져 있고 다른 테이블에서 실행 중입니다.
  • auto-vacuum은 실행되지 않으며 FULL테이블에 대한 독점 잠금이 필요 하지 않습니다 .

auto-vacuum이 왜 실행되지 않는지 아는 사람이 있습니까? 테이블이 계속 바쁘기 때문에 이것이 순수합니까?

그리고 그것은 가치가 실행중인 VACUUM모든 후, DELETE이 경우 (이는 매 10 분마다 운행)에서는?

편집하다:

아래 SO 링크에서 SQL을 사용하여 쿼리하십시오.

-[ RECORD 2 ]---+---------------------------
schemaname      | stats
relname         | statistic_values_by_sec
last_vacuum     |
last_autovacuum |
n_tup           |    932,315,264
dead_tup        |    940,727,818
av_threshold    |    186,463,103
expect_av       | *

원시 출력 :

-[ RECORD 3 ]-----+---------------------------
relid             | 501908
schemaname        | stats
relname           | statistic_values_by_sec
seq_scan          | 12
seq_tup_read      | 4526762064
idx_scan          | 29643
idx_tup_fetch     | 2544206912
n_tup_ins         | 1573896877
n_tup_upd         | 0
n_tup_del         | 941176496
n_tup_hot_upd     | 0
n_live_tup        | 688858417
n_dead_tup        | 940727818
last_vacuum       |
last_autovacuum   |
last_analyze      |
last_autoanalyze  | 2014-08-09 01:36:21.703+01
vacuum_count      | 0
autovacuum_count  | 0
analyze_count     | 0
autoanalyze_count | 69

4
PostgreSQL의 적극적인 Autovacuum을 참조하십시오 . 또한 select * from pg_stat_user_tables이 테이블 을 가지고 있으면 흥미로울 것입니다 ( \xpsql에서 형식이 좋은 출력을 위해 사용 )
Daniel Vérité

2
이 링크는 도움이되며 아마도 질문에 대한 답입니다. 테이블이 너무 바빠서 자동 진공이 작동하지 않습니다. @ DanielVérité 요청한 출력으로 질문을 업데이트했습니다.
Barry

3
많은 죽은 튜플입니다! 가능하면 타임 스탬프별로 테이블을 분할하고 이전 파티션을 삭제하는 대신 삭제하십시오. 파티션 전체에서 고유 한 인덱스가 지원되지 않는다는 주요 경고는 없습니다.
Daniel Vérité

1
로그 파일에이 테이블의 autovacuum에 대한 메시지가 취소됩니까?
jjanes

@jjanes 아니요-로그에 autovacuum이 시작되었다는 표시가 없습니다.
Barry

답변:


2

나는 파티셔닝 을 살펴볼 것이다 . 일별로 파티션을 나누면 너무 오래되면 전체 파티션을 삭제할 수 있습니다. 더 이상 진공 청소기로 청소하지 않아도됩니다.

또한 삭제하는 위치에 삽입하지 않기 때문에 전반적인 성능이 향상 될 수 있습니다. 새로운 파티션을 생성하고 오래된 파티션을 삭제하려면 코드를 작성하면됩니다.

이것이 바로 파티셔닝을위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.