使用外部数据包装器连接MS SQL Server和PostgreSQL

时间:2018-10-01 13:51:02

标签: sql-server postgresql freetds postgres-fdw

我在MS SQL Server和PostgreSQL之间使用了tds_fdw

我在PostgreSql中创建了一个外部服务器和外部表。当我从外部表中选择数据时,它还会运行Mssql吗?还是将数据存储在PostgreSQL中?

2 个答案:

答案 0 :(得分:1)

外部数据包装器只是查询远程数据的另一种方法。如果创建外部表,则访问该表的所有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完成处理。

答案 1 :(得分:0)

从外部表中选择时,查询将在SQL Server中执行。 但基于此问题:https://github.com/tds-fdw/tds_fdw/issues/154 您必须在外部表选项中将 row_estimate_method 设置为'showplan_all'。否则,查询将在SQL Server中运行两次。

示例: 我想使用postgres外部表在SQL Server中创建表:

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;