У меня есть DBlink, который выполняет выборку по заданной таблице c в удаленной базе данных. Поскольку эта удаленная таблица очень велика, мне нужно создать фильтр (с помощью где), чтобы вывести очень мало строк в локальную базу данных. Соединение между локальной базой данных и удаленной базой данных осуществляется через канал передачи данных 4G с ежемесячным пределом трафика c. Я испытывал огромное потребление данных и не понимал, почему.
Вчера я решил сделать тест. Я создал View в удаленной базе данных только с необходимыми данными (уже применяя тот, который был ранее применен в DBLink). Я переписал запрос через DbLink, на этот раз указывая на удаленный просмотр и без всякого.
В результате было сокращено потребление данных.
Создается впечатление, что Select через Dblink выполняет выбор * в удаленной таблице, переносит все данные и затем применяет where в локальной базе данных, вызывая чрезмерное потребление. Когда я сегментирую данные в представлении, это больше не происходит. У кого-нибудь есть какое-либо объяснение этому случаю?
Ниже приводится выбор, который я выполняю:
SELECT *
FROM dblink('cloud',
'select field1,
field2,
field3
from my_table
where field1 = 2
order by field1
limit 50'
)
AS rep( field1 int4,
field2 int4,
field3 int4
);
Еще один тест, который я сделал, - выполнить резервное копирование данных из удаленной таблицы и удалить большая часть данных оставляет только данные, используемые в DBlink. Потребление также снизилось, подтверждая мою теорию, что Postgres приносит все данные и выполняет фильтрацию только в локальной базе данных.