繁体   English   中英

做Postgres数据库表的全部到全部的最简单方法?

[英]Easiest Way To Do All-To-All Union Of Postgres Database Tables?

考虑一下这样的情况:N台机器每个都有一个postgres数据库,并且具有相同模式和含义的表A。 出于性能方面的考虑,我确实需要坚持使用此体系结构,但是用其所有集合数据的并集刷新每个数据库有点麻烦。

我能够自动执行此操作的程度是一个shell脚本:

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;

但这是我正在做的非常明确且普通的事情,因此我想知道是否存在一些用于此类所有通信的高级高级接口。 postgres Wiki中描述了一些分布式数据库方法,但是它们中的任何一个都可以做到这一点,否则不会迫使我重新思考或重新设计数据库吗?

我会用外国表。

为每个远程主机创建一个外部表。 然后创建一个包含union查询的union化视图。

当您要刷新所有内容时,只需refresh materialized view tablea_combined 无需倾销或还原。

当然,这假定您将所有服务器组合在一起的服务器可以连接到所有其他服务器。

如果您只是想要一种方便的方法来选择所有这些表,那么一个简单的视图可能就足够了-如果性能足够好,则取决于您对该视图的处理方式。

如果使用9.5或更高版本,则可以创建一个分区表,该表使用继承将外部表合并到“主”服务器上的一个表中。 为了提高效率,这要求您具有标识“源”服务器的列,并因此可以用作分区键。

@a_horse说的是 :在外部表上使用MATERIALIZED VIEW

另外,使用更简单的查询:

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返回不同的行,不需要冗余的DISTINCT (您将使用UNION ALL保留重复项。)

  • TABLE tableASELECT * FROM tableA的SQL简写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM