我tds_fdw
在 MS SQL Server 和 PostgreSQL 之间使用过。
我在 PostgreSql 中创建了一个外部服务器和外部表。当我从外部表中选择数据时,它也会运行 Mssql?还是 PostgreSQL 中的数据存储?
我tds_fdw
在 MS SQL Server 和 PostgreSQL 之间使用过。
我在 PostgreSql 中创建了一个外部服务器和外部表。当我从外部表中选择数据时,它也会运行 Mssql?还是 PostgreSQL 中的数据存储?
外部数据包装器只是查询远程数据的另一种方式。如果您创建外部表,则访问该表的任何 SELECT 都将转发到外部服务器(在您的情况下为 SQL Server)。
所以数据只存储在 SQL Server 中。
当您从外部表中选择时,外部数据包装器会将 SELECT 语句发送到 SQL Server。然后 SQL Server 将处理查询并将数据发送回 Postgres 服务器。然后,外部数据包装器将数据返回给您的应用程序(连接到您的 Postgres 服务器)。FDW 可以将一些操作“推送”到外部服务器,这样 Postgres 就不需要处理它们了。我不知道 tds_fdw 实现的细节,但是像WHERE
子句这样的东西通常会被推送到远程服务器,以便在 Postgres 端只处理相关数据。
从 MS SQL Server 的角度来看,FDW 只是另一个发送 SQL 查询的客户端。
当 MS SQL Server 正在处理请求时,Postgres(或更准确地说:为您的 Postgres 连接创建的后端)处于空闲状态(什么都不做)并等待 MS SQL Server 完成处理。
当您从外部表中选择时,查询将在 SQL 服务器中执行。但基于此问题:https ://github.com/tds-fdw/tds_fdw/issues/154 您必须在外表选项中将 row_estimate_method设置为“showplan_all”。否则,查询将在 SQL 服务器中运行两次。
示例:我想使用 postgres 外部表在 SQL 服务器中创建表:
DROP FOREIGN TABLE IF EXISTS ft_create_table;
CREATE FOREIGN TABLE ft_create_table()
SERVER sql_server
OPTIONS (row_estimate_method 'showplan_all' ,query 'CREATE TABLE [test](
[Id] [bigint] NOT NULL);';
SELECT * FROM ft_create_table;