Postgres - DBLINK - Как это работает? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть 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 приносит все данные и выполняет фильтрацию только в локальной базе данных.

1 Ответ

0 голосов
/ 27 апреля 2020

dblink просто передает запрос, как написано на другой стороне. Это, конечно, не удаляет ГДЕ или ПРЕДЕЛ. Я не знаю, что на самом деле происходит, но ваша теория, представленная здесь, не может это объяснить.

Чтобы проверить мое утверждение, вы можете установить log_statement = 'all' на внешней стороне и наблюдать, что запрос на самом деле работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...