답변:
핵심 단어는 다음과 같습니다.
포인트 1은 낮은 채우기 비율을 나타내며 2는 반대입니다. 여러 행 버전이 동일한 데이터 페이지에 저장된 경우 성능을 향상시킵니다. 최신 업데이트로 달성 할 수 있습니다. 여기 또는 여기를 읽으 십시오 . 그들은 데이터 페이지에 약간의 호기심 필요 - a로 예약 죽은 튜플 또는 공간 같은 fillfactor
<100 그러나 경우에 그들은 단지 자신의 일을 할 수있는 인덱스가 업데이트 된 열 중 관련없는 사건에 대한 진실해야한다.
여기에서 또 다른 중요한 요소는 튜플 크기 (페이지 크기 (가장 일반적으로 8kb)와 비교)입니다.
튜플 크기가 4kb 이상인 경우 데이터 페이지에 튜플이 두 개 이상 존재할 수 없으므로 채우기 비율을 줄이는 것은 쓸모가 없습니다. 당신은 또한 그것을 남겨 둘 수도 있습니다 100
(어쨌든 기본값입니다). 그러나 일부 데이터 유형은 크기 제한을 초과하는 경우 "토스트" 되고 라인 외부에 저장되므로 주요 관계 포크에서 많은 양을 요구하는 튜플은 드 rare니다.
무슨 일이 있어도, VACUUM
것 수시로 실행. 그리고 그것은 일반적으로 좋은 것입니다, 나는 그것에 대해 걱정하지 않을 것입니다. 죽은 튜플을 많이 만듭니다. VACUUM
더 이상 열린 트랜잭션에 표시되지 않는 데드 행을 식별합니다. 매뉴얼 :
표준 형식은
VACUUM
테이블과 인덱스에서 데드 행 버전 을 제거 하고 나중에 재사용 할 수있는 공간을 표시합니다 .
대담한 강조 광산.
당신은 놀 수있는 테이블 당 설정을 자동 진공가 단지이 테이블에 자주 이하 (이상)을 트리거 :
기본 임계 값 및 스케일 팩터는에서 가져
postgresql.conf
오지만 테이블별로이를 무시할 수 있습니다 .
대담한 강조 광산. 와 특히 autovacuum_vacuum_threshold
하고autovacuum_vacuum_scale_factor
. VACUUM
많이 실행 하는 것은 실제로 매우 낮은 대신 좋은 아이디어 일 수 있습니다 fillfacter
. 액세스 패턴에 따라 다릅니다. 모든 튜플이 3 시간 동안 살고 각각이 여러 번 업데이트되는 경우에도 여전히 fillfactor
50을 낮 춥니 다 . 스위트 스팟을 테스트하고 찾아야합니다.
이 모든 것을 제외하고는 데이터가 휘발성 인 것처럼 보이기 때문에 UNLOGGED
테이블을 사용 하십시오 .
기록되지 않은 테이블에 기록 된 데이터는 미리 기록 로그에 기록되지 않으므로 ( 29 장 참조 ) 일반 테이블보다 훨씬 빠릅니다 . 그러나 충돌에 안전하지 않습니다 . 충돌 또는 부정확 한 종료 후에 로그되지 않은 테이블이 자동으로 잘립니다. 로깅되지 않은 테이블의 내용도 대기 서버로 복제되지 않습니다.
대담한 강조 광산. 서버가 다운 되어도 여전히 데이터가 필요한 경우에는 이것을 사용하지 마십시오. 그러나 우리가 웹 애플리케이션의 세션 데이터에 관해 이야기하고 있다면, 이것은 지불할만한 가격이 될 수 있습니다.
또는 훨씬 더 급진적 입니다. RDBMS에서 제공하는 기능과 보안 없이도 Redis 와 같은 키-값 저장소를 사용하십시오 .
키-값 DBMS를 제안하지만 관심을 끌기 위해이를 버립니다.
INSERT & DELETE 문을 수행하는 대신 UPDATE 만 수행하십시오.
테이블 구조는 다음과 같습니다
ID integer -- sequential ID
Used boolean -- default FALSE
Object -- whatever type is appropriate
분할 및 행 이동을 피하기 위해 객체 유지 열의 길이는 고정되어 있습니다. 개체를 수용하고 디스크의 페이지를 효율적으로 채우려면이 열의 크기를 조정하십시오.
필요한만큼 많은 행으로 테이블을 미리 채우십시오.
개체를 쓰려면 Used = False 인 행을 찾아 해당 행을 업데이트하십시오. 개체를 파괴 할 때는 사용을 "거짓"으로 설정하십시오. 가비지 생성이 없으므로 가비지 수집이 없습니다.
물론 처리해야 할 예외 조건 (행 오버플로, 테이블 오버플로, ID 사용시 경쟁 조건 등)이 많지만 극복 할 수있는 것은 없습니다.