postgres_fdw: можно ли отправить данные на внешний сервер для присоединения?

предположим, у меня есть запрос вроде

select * from remote_table
   join local_table using(common_key)

где remote_table — это FOREIGN TABLE с postgres_fdw, а local_table — это обычная таблица.

local_table маленький (100 строк), а remote_table большой (миллионы строк).

Похоже, что удаленная таблица извлекается полностью и присоединяется локально, в то время как было бы более эффективно отправить меньшую таблицу на удаленный сервер и присоединиться удаленно.

Есть ли способ заставить postgres_fdw сделать это?


person wrschneider    schedule 22.08.2018    source источник
comment
CTE может разрешить push-down? Я не проверял: WITH cte AS (SELECT common_key FROM local_table) SELECT * FROM remote_table WHERE common_key IN (TABLE cte); Во втором случае: я сомневаюсь, что он может летать ...   -  person Erwin Brandstetter    schedule 16.04.2020
comment
Был связанный вопрос для другого FDW, и я придумал идею, которая не сработала. Однако может работать для postgres_fdw (и Postgres 12?). Возможно, вы захотите взглянуть: stackoverflow.com/a/61493138/939860   -  person Erwin Brandstetter    schedule 29.04.2020


Ответы (2)


Вы не можете сделать это с объединением, так как соединения между таблицами на разных серверах всегда выполняются локально.

Что вы можете попробовать, это что-то вроде:

SELECT *
FROM (SELECT *
      FROM remote_table
      WHERE common_key IN (SELECT common_key FROM local_table)
     ) a
  JOIN local_table USING (common_key);

Я не тестировал его, поэтому я не уверен, что он будет работать, но идея состоит в том, чтобы использовать условие для сканирования внешней таблицы, которое может быть протолкнуто вниз и максимально уменьшить количество извлекаемых данных.

person Laurenz Albe    schedule 23.08.2018
comment
Нет, это будет иметь ту же проблему, что и соединение. Предложения WHERE будут сброшены только в том случае, если их можно выполнить удаленно. Единственный способ, которым это будет работать, - это отправить содержимое самого local_table в удаленную БД. - person wrschneider; 27.08.2018
comment
Что ж, подумайте о другом решении в соответствии с моим ответом, например. создание списка IN из результата SELECT common_key FROM local_table. - person Laurenz Albe; 31.08.2018

Вы пытались развернуть локальные данные во временной таблице на внешнем сервере, а затем присоединиться к ним во внешней таблице? Не уверен в вашем процессе или в том, будет ли это эффективно для вас или нет.

person TheDaliofData    schedule 22.04.2020