PostgreSQL 테이블에 비해 얼마나 큰가요?


127

저는 우리 회사의 RoR 프로젝트를위한 설계 작업을하고 있으며, 우리 개발 팀은 이미 설계, 특히 데이터베이스에 대해 약간의 논쟁을 벌였습니다.

Message지속되어야 하는 모델 이 있습니다. 이것은 id 이외의 db 열이 3 개 밖에없는 매우 작은 모델이지만, 프로덕션 단계에서는 이러한 모델이 많이있을 것입니다. 우리는 하루에 최대 1,000,000 건의 삽입을보고 있습니다. 모델은 색인화 할 수있는 두 개의 외래 키로 만 검색됩니다. 또한 모델을 삭제할 필요가 없지만 약 3 개월이 지나면 보관할 필요도 없습니다.

그래서 우리가 궁금해하는 것은 Postgres에서이 테이블을 구현하면 심각한 성능 문제가 발생하는지 여부입니다. 누구든지 이것이 문제가 될지 여부를 알려주기 위해 매우 큰 SQL 데이터베이스에 대한 경험이 있습니까? 그렇다면 어떤 대안을 선택해야합니까?


3
좋은 캐싱 레이어와 PG의 약간의 구성으로 괜찮을 것입니다. 경우에 따라 성능 문제를 해결하고 사전 최적화를 피해야합니다. 즉, 파티셔닝과 복제는 항상 병목 현상이 발생하면 활용할 수있는 훌륭한 옵션입니다.
Sam

1
여기여기에 관련 질문 .
Erwin Brandstetter 2014

5
우리는 5TB 이상의 PostgreSQL 데이터베이스에서 하루에 약 3 천만 개의 메시지를 처리하며 정상적으로 작동합니다.
Frank Heikens 2014


1
참고로, 저는 오늘 postgresql.org/about을 읽고 있었는데 (원칙적으로) 테이블의 행 수가 무제한이라는 것을 알았습니다.
Al Chou

답변:


115

테이블 당 행은 그 자체로 문제가되지 않습니다.

따라서 대략 90 일 동안 하루에 1 백만 개의 행을 말하면 9 천만 행입니다. 나는 Postgres가 당신이하는 일에 대한 모든 세부 사항을 알지 않고는 그것을 다룰 수없는 이유를 보지 못합니다.

데이터 배포에 따라 인덱스, 필터링 된 인덱스 및 일종의 테이블 파티셔닝을 혼합하여 사용할 수 있습니다. 귀하의 문제는 내가 아는 다른 RDMS에서도 동일합니다. 데이터를 제거하는 프로세스에서 3 개월 분량의 데이터 디자인 만 필요하다면 더 이상 필요하지 않습니다. 이렇게하면 테이블에 일관된 양의 데이터를 유지할 수 있습니다. 운 좋게도 얼마나 많은 데이터가 존재할지 알고 볼륨에 대해 테스트하고 얻는 것을 확인하십시오. 9 천만 개의 행이있는 하나의 테이블을 테스트하는 것은 다음과 같이 쉽습니다.

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited

19
나는 9 천만개의 행이 PostgreSQL에 문제가되지 않을 것이라는 데 동의합니다. 그러나 PostgreSQL을 사용하는 ORM의 경우 문제 있습니다. (실제로 모든 dbms가있는 ORM입니다.)
Mike Sherrill 'Cat Recall'2

@ MikeSherrill'Catcall '좋은 지적은 "PostgreSQL 테이블에 비해 얼마나 큰지?"에 집중했습니다.
Kuberchaun 2014

2
@yeyo : ORM은 일반적으로 하나 또는 두 개만으로 반환 될 수 있는 데이터를 얻기 위해 많은 쿼리를 사용하기 때문 입니다. OP는 Ruby on Rails를 사용하고 있습니다.
Mike Sherrill 'Cat

39
이것은 조금 늦었지만 많은 경우 (특히 레일 / 활성 레코드의 경우) 방정식에서 ORM을 완전히 제거하고 성능상의 이유로 쿼리 할 원시 SQL 문자열을 작성하는 것이 일반적이라고 생각합니다. ORM이 데이터 결정을 내 리도록하지 마십시오! 필수가 아닌 액세서리입니다.
Stefan Theard

2
URL에 인용 된 about URL은 현재 이러한 제한을 표시하지 않습니다. 이동 된 위치를 아는 사람이 있습니까?
Shorn

58

행이 1 억 이상인 테이블에서 쿼리 속도를 크게 높이는 또 다른 방법은 쿼리에서 가장 자주 사용되는 인덱스의 테이블을 업무 외 시간에 클러스터링하는 것입니다. 2 억 1,800 만 개 이상의 행이있는 테이블이 있으며 30 배 개선 된 것으로 나타났습니다.

또한 매우 큰 테이블의 경우 외래 키에 대한 인덱스를 만드는 것이 좋습니다.


> 업무 외 시간에 쿼리에서 가장 자주 사용되는 인덱스의 테이블을 클러스터링하십시오 ....이 작업이 어떻게 수행되는지 설명 할 수 있습니까?
스파이

6
예 여기에 단계별 예가 있습니다. 1) 제가 언급하는 표를이 예에서 투자라고합니다. 2) 쿼리에서 가장 많이 사용되는 인덱스는 (bankid, record_date)입니다. 따라서 단계별로 다음 단계를 따르십시오. 1) psql -c "drop index invest_bankid_rec_dt_idx;" dbname 2) psql -c "investment_bankid_rec_dt_idx 인덱스 생성 (bankid, record_date);" 3) psql -c "투자에 대한 cluster invest_bankid_rec_dt_idx;" 4) vacuumdb -d ccbank -z -v -t 투자 따라서 1 단계와 2 단계에서 인덱스를 삭제하고 다시 만듭니다.
James Doherty

3
3 단계에서 클러스터를 생성하면 기본적으로 DB 테이블이 인덱스의 물리적 순서로 배치되므로 postgresql이 쿼리를 수행 할 때 가장 가능성이 높은 다음 행을 캐시합니다. 4 단계 우리는 쿼리 플래너에 대한 통계를 재설정하기 위해 데이터베이스를 진공 청소합니다
James Doherty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.