Greenplum 的 FDW 工具多次复制数据

问题描述

我有 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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...