4

我正在通过fdw_postgres从不同的数据库访问数据。它运作良好:

CREATE FOREIGN TABLE fdw_table 
(
  name TEXT,
  area double precision,
  use TEXT,
  geom GEOMETRY
)
SERVER foreign_db 
OPTIONS (schema_name 'schema_A', table_name 'table_B')

但是,当我查询data_typefdw_table 时,我得到以下结果: name text area double precision use text geom USER-DEFINED

fdw_postgres不能处理 PostGIS 的 GEOMETRY 数据类型吗在这种情况下,用户定义是什么意思?

4

2 回答 2

5

从该列的文档data_type中:

列的数据类型,如果它是内置类型,或者ARRAY是某个数组(在这种情况下,请参阅视图element_types),否则 (在这种情况下,类型在和关联的列USER-DEFINED中标识)。udt_name

所以这不是外籍女佣特有的;您会看到物理表的相同定义。

postgres_fdw可以很好地处理自定义数据类型,但目前有一个警告:如果您使用WHERE涉及用户定义类型的条件查询外部表,它不会将此条件推送到外部服务器。

换句话说,如果您的WHERE子句仅引用内置类型,例如:

SELECT *
FROM fdw_table
WHERE name = $1

...然后该WHERE子句将被发送到外部服务器,并且只会检索匹配的行。但是当涉及到用户定义的类型时,例如:

SELECT *
FROM fdw_table
WHERE geom = $1

...然后从外部服务器检索整个表,并在本地执行过滤。

Postgres 9.6将通过允许您将扩展列表附加到外部服务器对象来解决此问题。

于 2016-06-09T22:15:01.633 回答
0

好吧,显然您将需要在两端定义的任何非标准类型。不要忘记 FDW 功能应该支持各种不同的数据库平台,因此没有任何神奇的方法可以在数据类型上导入远程操作。实际上,考虑到一端可能运行在 MS-Windows 上,另一端运行在基于 ARM 的 Linux 上,那么仅使用 PostgreSQL 甚至都没有一种明智的方法。

于 2016-06-09T20:25:39.517 回答