我正在通过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')
然而,当我查询fdw_table的data_type
时,我得到以下结果:
name text
area double precision
use text
geom USER-DEFINED
fdw_postgres是否可以不处理PostGIS的几何数据类型?在这种情况下,USER-DEFINED是什么意思?
来自data_type
列上的文档:
列的数据类型(如果是内置类型),或
ARRAY
(如果是)某个数组(在这种情况下,请参见视图element_types
),否则USER-DEFINED
(在这种情况下,类型在udt_name
和关联列)。
所以这不是FDW特有的;对于物理表,您会看到相同的定义。
postgres_fdw
可以很好地处理自定义数据类型,但目前有一点需要注意:如果使用涉及用户定义类型的WHERE
条件查询外部表,它不会将此条件推送到外部服务器。
换句话说,如果您的WHERE
子句只引用内置类型,例如:
SELECT *
FROM fdw_table
WHERE name = $1
则WHERE
子句将被发送到外部服务器,并且仅检索匹配的行。但当涉及用户定义的类型时,例如:
SELECT *
FROM fdw_table
WHERE geom = $1
然后从外部服务器检索整个表,并在本地执行筛选。
Postgres9.6将通过允许您将扩展列表附加到外部服务器对象来解决此问题。
很明显,您需要在两端定义任何非标准类型。不要忘记,FDW功能应该支持各种不同的数据库平台,因此没有任何神奇的方法可以导入数据类型上的远程操作。事实上,考虑到一端可以在MS Windows上运行,另一端可以在基于ARM的Linux上运行,甚至没有一种明智的方法可以只使用PostgreSQL来实现这一点。