2

N 개의 기계가 각각 하나의 포스트그레스 데이터베이스를 가지고 있고, 동일한 스키마와 의미의 테이블 A를 가지고있는 상황을 고려해보십시오. 성능상의 이유로이 아키텍처를 고수해야하지만 모든 데이터를 통합하여 각 데이터베이스를 새로 고치는 것은 다소 힘든 일입니다.All-To-All Union of Postgres 데이터베이스 테이블을 만드는 가장 쉬운 방법은?

나는이 문제를 자동화 할 수있었습니다 정도는 쉘 스크립트가하고 있습니다 :

mycopy=tableA_`hostname`.pg 
pg_dump -t tableA -d $database | sed "s/tableA/$mycopy" > $mycopy 
for host in host_x host_y host_z; do 
    scp $mycopy host:~/ 
done 

다음 SQL 스크립트를

BEGIN; 
\i tableA_hostx.pg 
\i tableA_hosty.pg 
\i tableA_hostz.pg 
CREATE TABLE new_tableA AS 
       (select * from tableA) 
UNION DISTINCT (select * from tableA_hostx) 
UNION DISTINCT (select * from tableA_hosty) 
UNION DISTINCT (select * from tableA_hostz); 
DROP TABLE tableA; 
DROP TABLE table_hostx; 
DROP TABLE table_hosty; 
DROP TABLE table_hostz; 
ALTER TABLE new_tableA rename to tableA; 
COMMIT; 

하지만이를 매우 잘 정의 및 일반 내가하고있는 것 같아서, 이런 모든 것 - 투 - 모든 커뮤니케이션을위한 고급 고급 인터페이스가 있는지 궁금해. the postgres wiki에 설명 된 일부 분산 데이터베이스 접근 방식이 있지만 그 중 어떤 것도 정확하게 수행 할 수 있습니까? 그렇지 않으면 내 데이터베이스에 대해 많이 재고하거나 재 설계하지 않아도됩니까?

+0

흠, N 호스트 각각에서 pg_basebackup (N-1) 번 실행해야 할 것 같습니다. pg_dump + scp 접근법보다 어떤 이점이 있는지 확실하지 않습니다. 내 SQL 스크립트에서하고있는 것처럼 각 테이블을 UNION DISTINCT와 자동으로 병합합니까? 또한, 다른 테이블 (테이블 A)을 병합하고 싶지 않습니다. – seewalker

+0

어떤 postgresql 버전을 사용하고 있습니까? – harmic

답변

3

외부 테이블을 사용합니다.

각 원격 호스트마다 하나의 외부 테이블을 만듭니다. 그런 다음 union 쿼리가 포함 된 구체화 된보기를 작성하십시오.

모든 것을 새로 고침 할 때는 refresh materialized view tablea_combined 만 있으면됩니다. 덤핑 또는 복원 불필요.

물론 다른 모든 서버에 연결할 수있는 모든 서버를 결합한 서버라고 가정합니다.

모든 테이블을 편리하게 선택하려면 간단한보기만으로도 충분할 수 있습니다. 성능이 충분할 경우 수행 할 작업에 따라 다릅니다.

9.5 이상을 사용하는 경우 uses inheritance 외부 테이블을 "마스터"서버의 한 테이블로 결합하는 분할 된 테이블을 만들 수 있습니다. 효율성을 높이려면 "원본"서버를 식별하는 열이 있어야하므로 분할 키로 사용할 수 있어야합니다.

1

What @a_horse said : foreign tablesMATERIALIZED VIEW을 사용하십시오. 중복 DISTINCT에 대한

CREATE MATERIALIZED VIEW new_tableA AS 
     TABLE tableA 
UNION TABLE tableA_hostx -- being a foreign table 
UNION TABLE tableA_hosty 
UNION TABLE tableA_hostz; 
  • UNION 반환 별개의 행 어쨌든 필요가 없습니다 :

    플러스, 간단한 쿼리를 사용합니다. UNION ALL 중복 보관하십시오.

  • TABLE tableASELECT * FROM tableA의 SQL 약어입니다.