캐싱 테이블의 채우기 요소는 무엇입니까?


10

직렬화 된 Java 객체를 저장하는 테이블을 많이 업데이트하고 액세스했습니다. 그들은 2-3 시간 동안 테이블에 있고 (또한 그 기간 동안 업데이트되고 있음) 제거되었습니다. 테이블 크기는 약 300MB입니다. 나는 그것이 매우 자주 진공 상태임을 발견했으며 변경 fillfactor이 도움 이 될지 궁금합니다 .

답변:


17

핵심 단어는 다음과 같습니다.

  1. "대폭 업데이트"
  2. "테이블에서 2-3 시간 동안".

포인트 1은 낮은 채우기 비율을 나타내며 2는 반대입니다. 여러 행 버전이 동일한 데이터 페이지에 저장된 경우 성능을 향상시킵니다. 최신 업데이트로 달성 할 수 있습니다. 여기 또는 여기를 읽으 십시오 . 그들은 데이터 페이지에 약간의 호기심 필요 - a로 예약 죽은 튜플 또는 공간 같은 fillfactor<100 그러나 경우에 그들은 단지 자신의 일을 할 수있는 인덱스가 업데이트 된 열 중 관련없는 사건에 대한 진실해야한다.

여기에서 또 다른 중요한 요소는 튜플 크기 (페이지 크기 (가장 일반적으로 8kb)와 비교)입니다.

튜플 크기가 4kb 이상인 경우 데이터 페이지에 튜플이 두 개 이상 존재할 수 없으므로 채우기 비율을 줄이는 것은 쓸모가 없습니다. 당신은 또한 그것을 남겨 둘 수도 있습니다 100(어쨌든 기본값입니다). 그러나 일부 데이터 유형은 크기 제한을 초과하는 경우 "토스트" 되고 라인 외부에 저장되므로 주요 관계 포크에서 많은 양을 요구하는 튜플은 드 rare니다.

무슨 일이 있어도, VACUUM 수시로 실행. 그리고 그것은 일반적으로 좋은 것입니다, 나는 그것에 대해 걱정하지 않을 것입니다. 죽은 튜플을 많이 만듭니다. VACUUM더 이상 열린 트랜잭션에 표시되지 않는 데드 행을 식별합니다. 매뉴얼 :

표준 형식은 VACUUM테이블과 인덱스에서 데드 행 버전 을 제거 하고 나중에 재사용 할 수있는 공간을 표시합니다 .

대담한 강조 광산.
당신은 놀 수있는 테이블 당 설정을 자동 진공가 단지이 테이블에 자주 이하 (이상)을 트리거 :

기본 임계 값 및 스케일 팩터는에서 가져 postgresql.conf오지만 테이블별로이를 무시할 수 있습니다 .

대담한 강조 광산. 와 특히 autovacuum_vacuum_threshold하고autovacuum_vacuum_scale_factor . VACUUM많이 실행 하는 것은 실제로 매우 낮은 대신 좋은 아이디어 일 수 있습니다 fillfacter. 액세스 패턴에 따라 다릅니다. 모든 튜플이 3 시간 동안 살고 각각이 여러 번 업데이트되는 경우에도 여전히 fillfactor50을 낮 춥니 다 . 스위트 스팟을 테스트하고 찾아야합니다.

대안

이 모든 것을 제외하고는 데이터가 휘발성 인 것처럼 보이기 때문에 UNLOGGED테이블을 사용 하십시오 .

기록되지 않은 테이블에 기록 된 데이터는 미리 기록 로그에 기록되지 않으므로 ( 29 장 참조 ) 일반 테이블보다 훨씬 빠릅니다 . 그러나 충돌에 안전하지 않습니다 . 충돌 또는 부정확 한 종료 후에 로그되지 않은 테이블이 자동으로 잘립니다. 로깅되지 않은 테이블의 내용도 대기 서버로 복제되지 않습니다.

대담한 강조 광산. 서버가 다운 되어도 여전히 데이터가 필요한 경우에는 이것을 사용하지 마십시오. 그러나 우리가 웹 애플리케이션의 세션 데이터에 관해 이야기하고 있다면, 이것은 지불할만한 가격이 될 수 있습니다.

또는 훨씬 더 급진적 입니다. RDBMS에서 제공하는 기능과 보안 없이도 Redis 와 같은 키-값 저장소를 사용하십시오 .


나는 UNLOGGED가 내가 필요로하는 것 같아요
Michal

0

키-값 DBMS를 제안하지만 관심을 끌기 위해이를 버립니다.

INSERT & DELETE 문을 수행하는 대신 UPDATE 만 수행하십시오.

테이블 구조는 다음과 같습니다

ID      integer  -- sequential ID
Used    boolean  -- default FALSE
Object  -- whatever type is appropriate

분할 및 행 이동을 피하기 위해 객체 유지 열의 길이는 고정되어 있습니다. 개체를 수용하고 디스크의 페이지를 효율적으로 채우려면이 열의 크기를 조정하십시오.

필요한만큼 많은 행으로 테이블을 미리 채우십시오.

개체를 쓰려면 Used = False 인 행을 찾아 해당 행을 업데이트하십시오. 개체를 파괴 할 때는 사용을 "거짓"으로 설정하십시오. 가비지 생성이 없으므로 가비지 수집이 없습니다.

물론 처리해야 할 예외 조건 (행 오버플로, 테이블 오버플로, ID 사용시 경쟁 조건 등)이 많지만 극복 할 수있는 것은 없습니다.


내가 이해하는 한,이 UPDATE는 일반적으로 HOT 업데이트가 아닌 한 행의 완전히 새로운 사본을 디스크에 씁니다. 따라서 시간이 지남에 따라 여전히 GC / Vacuuming이 필요합니다.
Jeff Widman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.