问题描述
我有 Greenplum 数据库版本 6.14.1,在 CentOS 7.2 主机上工作。
所以我尝试通过外部数据包装器将数据从 Postgres 11 复制到 Greenplum 6.14。 使用默认选项,我收到 N 行,所有数据都来自主节点。 所以我决定将选项更改为 (mpp_execute "all segment"), 但在这种情况下,我收到 24*N 行,因为我的集群有 24 个段节点。
我认为这是众所周知的问题,但不幸的是根本找不到解决方案。
重现行为的步骤:
在 Postgres 服务器上
create table x(id int,value float8);
insert into x select r,r * random() from generate_series(1,1000) r;
select count(*) from x;
1000
(1 row)
在Greenplum服务器上
CREATE EXTENSION postgres_fdw;
create server foreign_server_x FOREIGN DATA WRAPPER postgres_fdw
OPTIONS(host '172.16.128.135',port '5432',dbname 'postgres');
-- user mapping
CREATE USER MAPPING FOR current_user
SERVER foreign_server_x OPTIONS (user 'admin',password 'admin');
-- foreign table foreign_x
CREATE FOREIGN TABLE foreign_x
(id int,value float8) SERVER foreign_server_x OPTIONS (schema_name 'public',table_name 'x');
select count(*) from foreign_x;
1000
(1 row)
-- mpp_execute = all segments
alter foreign table foreign_x options (add mpp_execute 'all segments');
-- foreign_x (24 segments)
select count(*) from foreign_x;
24000
(1 row)
解决方法
这是预期的行为,因为您有 24 个段,并且要求所有段都去查询数据库。我建议尝试仅从 master 执行,或选择唯一计数 (*),或利用外部表而不是 FDW。