PostgreSQL 초기 데이터베이스 크기


12

내 질문에는 두 부분이 있습니다.

  1. PostgreSQL에서 데이터베이스의 초기 크기를 지정하는 방법이 있습니까?
  2. 그렇지 않은 경우 시간이 지남에 따라 데이터베이스가 커질 때 조각화를 어떻게 처리합니까?

최근에 MSSQL에서 Postgres로 마이그레이션했으며 데이터베이스를 만들 때 MSSQL 세계에서 한 일 중 하나는 데이터베이스 및 트랜잭션 로그의 초기 크기를 지정하는 것이 었습니다. 이는 특히 데이터베이스의 "정상"크기를 미리 알고있는 경우 조각화를 줄이고 성능을 향상 시켰습니다.

크기가 커질수록 데이터베이스 성능이 떨어집니다. 예를 들어, 내가 수행하는 작업량은 보통 10 분이 걸립니다. 데이터베이스가 커지면이 시간이 늘어납니다. VACUUM, VACUUM FULL 및 VACUUM FULL ANALYZE를 수행해도 문제가 해결되지 않습니다. 성능 문제를 해결하는 것은 데이터베이스를 중지하고 드라이브를 조각 모음 한 다음 VACUUM FULL ANALYZE를 수행하면 테스트 성능이 원래 10 분으로 되돌아갑니다. 이것은 파편화가 나를 고통스럽게 만드는 원인으로 의심됩니다.

Postgres에서 테이블 공간 / 데이터베이스 공간 예약에 대한 참조를 찾을 수 없었습니다. 잘못된 용어를 사용하여 아무것도 찾지 못하거나 Postgres에서 파일 시스템 조각화를 완화하는 다른 방법이 있습니다.

어떤 포인터?

해결책

제공된 답변은 내가 의심하기 시작한 것을 확인하는 데 도움이되었습니다. PostgreSQL은 데이터베이스를 여러 파일에 저장하므로 조각화 걱정없이 데이터베이스를 확장 할 수 있습니다. 기본 동작은 이러한 파일을 테이블 데이터가있는 가장자리에 묶는 것입니다. 테이블 데이터는 거의 변경되지 않지만 자주 업데이트되는 테이블에는 적합하지 않습니다.

PostgreSQL은 MVCC 를 사용하여 테이블 데이터에 대한 동시 액세스를 제공합니다. 이 체계에서 각 업데이트는 업데이트 된 새로운 버전 의 행을 만듭니다 (이것은 타임 스탬프 또는 버전 번호를 통해 알 수 있습니까?). 이전 데이터는 즉시 삭제되지 않지만 삭제 표시됩니다. 실제 삭제는 VACUUM 작업이 수행 될 때 발생합니다.

이것은 채우기 비율과 어떤 관련이 있습니까? 테이블 기본 채우기 비율 100은 테이블 페이지를 완전히 압축하므로 테이블 페이지 내에 업데이트 된 행을 보유 할 공간이 없습니다. 즉, 업데이트 된 행은 원래 행과 다른 테이블 페이지에 배치됩니다. 내 경험이 보여주는 것처럼 성능이 좋지 않습니다. 요약 테이블이 매우 자주 업데이트 될 때 (최대 1500 행 / 초) 채우기 비율을 20으로 설정했습니다. 즉, 테이블의 20 %는 삽입 된 행 데이터에, 80 %는 업데이트 데이터에 사용됩니다. 이것이 과도하게 보일 수 있지만 업데이트 된 행에 예약 된 대량의 공간은 업데이트 된 행이 원본과 동일한 페이지 내에 유지되고 autovacuum 데몬이 사용되지 않는 행을 제거하기 위해 실행될 때까지 테이블 페이지가 가득 차지 않은 것을 의미합니다.

데이터베이스를 "수정"하기 위해 다음을 수행했습니다.

  1. 요약 테이블의 채우기 비율을 20으로 설정하십시오. 작성시 또는 CREATE TABLE에 매개 변수를 전달 하거나 ALTER TABLE을 통해 사실 이후에 이를 수행 할 수 있습니다 . 다음 plpgsql 명령을 실행했습니다.ALTER TABLE "my_summary_table" SET (fillfactor = 20);
  2. VACUUM FULL을 발행했습니다. 완전히 새로운 버전의 테이블 파일을 작성하기 때문에 새로운 채우기 비율로 새로운 테이블 파일을 작성 합니다.

테스트를 실행하면 데이터베이스가 수백만 행에 필요한만큼 커도 성능이 저하되지 않습니다.

TL; DR-파일 조각화가 원인이 아니라 테이블 스페이스 조각화입니다. 이는 특정 사용 사례에 맞게 테이블의 채우기 비율을 조정하여 완화됩니다.


파일 크기 조정 작업인지 의심 스럽습니다. 인덱스를 유지 관리하는 것이 인서트 속도를 늦추는 것 같습니다. 이에 대한 PG 메일 링리스트에 대한 현재 논의가 있습니다 (해결책은 없지만) : postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name

답변:


4
  1. --with-segsize 스위치를 사용하여 서버를 컴파일 할 때는 테이블이 공연보다 많은 공간을 차지하고 파일 시스템이 공연을 넘어서는 단일 파일을 처리 할 수있는 경우 도움이 될 수 있습니다. 20 기가를 삽입하면이 스위치를 사용하지 않으면 20 개의 파일을 만들어야합니다. 파일 시스템이 공연을 통해 파일을 처리 할 수있는 경우 파일을 큰 값으로 설정하면 가장 큰 이점을 볼 수 있습니다. 최악의 경우에는 작은 이점이 있습니다.

  2. 봐에서 CLUSTER http://www.postgresql.org/docs/9.1/static/sql-cluster.html 및 FILLFACTOR http://www.postgresql.org/docs/9.1/static/sql-createtable.html , http://www.postgresql.org/docs/9.1/static/sql-createindex.html

FILLFACTOR는 테이블과 인덱스 모두에 적용 할 수 있습니다.


5

아직 방정식을 입력하지 않은 또 다른 것이 있습니다 : HOT update . 관련 답변 :

설정 FILLFACTOR으로 낮은 것은 같은 20 않는 과도한 보인다. 테이블을 최대 5 배까지 팽창시킵니다. HOT 업데이트가 작동하면 일반적으로 그렇게 낮게 갈 필요는 없습니다 .

예외 사항 : HOT 업데이트는 동일 하거나 동시적인 트랜잭션 이 아닌 이전 트랜잭션의 죽은 튜플 만 재사용 할 수 있습니다. 따라서 많은 양의 동시로드 또는 동일한 트랜잭션을 반복적으로 업데이트하는 긴 트랜잭션은 이러한 낮은 (또는 더 낮은) 설정을 보증 할 수 있습니다.

큰 업데이트가 있고 테이블의 큰 부분을 한 번에 변경하는 경우 두 개의 청크로 분할하여 데이터 페이지에서 로컬로 한 번에 많은 행을 변경하는 것이 이상적입니다. 그러나 그것은 추정하고 규제하기가 어렵습니다.

HOT 업데이트는 변경된 열이 어떤 식 으로든 인덱스관련되지 않은 경우 (데이터 또는 부분 인덱스의 조건 이 아님) 에만 작동합니다 . 업데이트 된 열에 인덱스가있는 HOT 업데이트를 차단했을 수 있습니다. 소모품이 있으면 전체 성능이 향상되지 않을 수 있습니다.

마지막으로 테이블 당 autovacuum 매개 변수를 설정할 수 있습니다 . 공격적인 설정으로 과도하게 업데이트 된 테이블을 대상으로하는 것보다 행을 좀 더 조밀하게 압축 할 수 FILLFACTOR 20있습니다.


1
흥미로운 것들, 나는 그것을 읽고 HOT 업데이트가 내 시스템에 무엇을 의미하는지 더 잘 이해하려고 노력할 것입니다.
CadentOrange

4

문제가 파일 조각화라면 아니오입니다. Postgres에서 각 테이블은 파일 시스템에서 자체 파일 또는 TOAST를 사용하는 경우 파일 세트를 가져옵니다. 예를 들어, 테이블 크기를 조정하기 위해 미리 크기가 조정 된 테이블 공간 파일을 생성하는 Oracle (또는 MS-SQL)과는 다릅니다. 테이블 공간 파일이 확장되거나 파일 시스템이 시작하기에 나쁘게 조각났습니다.

두 번째 질문에 관해서는 ... MS-Windows는 조각화 문제가 발생한 유일한 OS이므로 절대로 더 이상 MS-Windows를 실행하지 않기 때문에 파일 시스템 조각화를 깨끗하게 처리하는 방법을 모르겠습니다. 요즘 필요합니다. 아마도 데이터베이스 파일을 자체 디스크에 배치하면 어느 정도 완화 할 수 있습니다.


내부 PostgreSQL 데이터베이스 조각화와 외부 파일 시스템 조각화가 있습니다. 내부는 VACUUM과 CLUSTERS 및 FILLFACTOR를 사용하여 완화 할 수 있다고 생각합니다. 주어진 파일 시스템에 대해 조각 모음을 실행하여 파일 시스템을 처리 할 수 ​​있습니다. 또한 Linux / Unix 파일 시스템은 작업로드 및 파일 시스템 유형에 따라 여러 번 조각화 될 수 있습니다.
Kuberchaun

오늘날 NTFS의 파일 시스템 조각화는 큰 문제가 아닙니다.
a_horse_with_no_name

1
NTFS가 유명하다고 생각 했습니까? 내 워크 스테이션 컴퓨터는 상당히 잘 짜여져 있으며,이를 제어 할 수있는 유일한 것은 Windows7이 매일 실행되는 예약 조각 모음입니다.
Kuberchaun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.