更新时间:2024-09-02 GMT+08:00

CREATE FOREIGN TABLE (SQL on other GaussDB(DWS))

功能描述

在当前数据库创建一个协同分析的外表,用来访问存储在协同分析其他集群数据库中的表。

该外表是只读的,只能用于查询操作,可直接使用SELECT语句查询其数据。

语法格式

1
2
3
4
5
6
7
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
( [ { column_name type_name | LIKE source_table } [, ...] ] )
SERVER server_name
OPTIONS ( { option_name ' value ' } [, ...] )
[ READ ONLY ]
[ DISTRIBUTE BY {ROUNDROBIN} ]
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];

参数说明

  • IF NOT EXISTS

    如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。

  • table_name

    外表的表名。

    取值范围:字符串,要符合标识符的命名规范。

  • column_name

    外表中的字段名。可以选择多个字段名,中间用“,”隔开。

    取值范围:字符串,要符合标识符的命名规范。

    不允许在列上创建约束,也不允许创建索引。

  • type_name

    字段的数据类型。

    不允许使用序列当作类型和使用自定义类型。

  • SERVER server_name

    server名称。允许用户自定义名称。

    取值范围:字符串,要符合标识符的命名规范,并且该server必须存在。

  • OPTIONS ( { option_name ' value ' } [, ...] )

    用于指定外表数据的各类参数,参数类型如下所示。

    • table_name:对应关联集群的表名,如果省略此option则认为该值和外表名字一样。
    • schema_name:对应关联集群的schema,如果省略此option则认为该值和外表所在的schema一样。
    • encoding:对应关联集群的编码,如果省略此option则使用关联集群的数据库编码。
    • dataencoding:用于实现GDS互联互通时两个latin1库中GBK数据和UTF8数据的同步。该参数仅8.2.0及以上集群版本支持。

      当设置该参数时,encoding表示远端集群数据的真实编码,dataencoding表示为本地执行端的集群数据的真实编码。

    假如本地执行端和远端两个数据库分别为latin1_local_db和latin1_remote_db,latin1_remote_db中存储着GBK的数据,当把latin1_remote_db中GBK的数据以UTF8的编码迁移到latin1_local_db时,需要在本地端的集群设置外表的dataencoding为UTF8,encoding为GBK。

  • gds_compress

    GDS互联互通为了降低网络传输带宽,提供了压缩参数,默认不压缩,当前仅支持设置值为snappy。该参数仅8.2.0及以上集群版本支持。

    使用该功能时需要保证本地集群,远端集群,GDS的版本至少在同一版本。

    gds_compress与file_type配合使用,当file_type的参数为interconn时,gds需要升级到8.2.0及以上版本,否则会出现ERROR: un-support format报错。

  • READ ONLY

    显示表是外表为只读。

  • DISTRIBUTE BY ROUNDROBIN

    显示指定外表为ROUNDROBIN分布方式。

  • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

    TO GROUP目前不支持使用。TO NODE主要供内部扩容工具使用,一般用户不应使用。

示例

  1. 创建名称为server_remote的外部服务器,对应的foreign data wrapper为GC_FDW。
    1
    CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',dbname 'test', username 'test', password '{password}');
    
    • 在可选项options里面写入了关联集群CN对应的IP地址及端口号。这里推荐使用填写一个LVS的地址或者多个CN的地址。
  2. 创建名称为region的外表:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    CREATE FOREIGN TABLE region
    (
        R_REGIONKEY INT4,
        R_NAME TEXT,
        R_COMMENT TEXT
    )
    SERVER
        server_remote
    OPTIONS
    (
        schema_name 'test',
        table_name 'region',
        encoding 'gbk'
    );
    
  3. 查看创建的外表region:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    \d+ region
    
                                  Foreign table "public.region"
       Column    |  Type   | Modifiers | FDW Options | Storage  | Stats target | Description
    -------------+---------+-----------+-------------+----------+--------------+-------------
     r_regionkey | integer |           |             | plain    |              |
     r_name      | text    |           |             | extended |              |
     r_comment   | text    |           |             | extended |              |
    Server: server_remote
    FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk')
    FDW permission: read only
    Has OIDs: no
    Distribute By: ROUND ROBIN
    Location Nodes: ALL DATANODES