Соедините 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;