Соедините MS SQL Server и PostgreSQL, используя стороннюю оболочку данных

Я использовал tds_fdw между MS SQL Server и PostgreSQL.

Я создал сторонний сервер и сторонние таблицы в PostgreSql. Когда я выбираю данные из внешней таблицы, он также запускает Mssql? Или хранилище данных в PostgreSQL?

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.

При выборе из сторонней таблицы запрос будет выполняться на сервере 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;
Другие вопросы по тегам