Расширение Postgresql dblink работает слишком медленно

#postgresql

#postgresql

Вопрос:

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

Я решил использовать расширение dblink для объединения этих таблиц через union all, но оно стало слишком медленным.

Например:

 CREATE DATABASE Test1;
 

После этого я запускаю нижеприведенные запросы в pgadmin и анализирую объединение всех в одной базе данных

 CREATE TABLE A_Test1(id int NOT NULL);
INSERT INTO A_Test1
   SELECT x
   FROM generate_series(1, 1000000) AS x;   
CREATE TABLE B_Test1(id int NOT NULL);
INSERT INTO B_Test1
   SELECT x
   FROM generate_series(1, 1000000) AS x;   
SELECT id FROM  A_Test1
UNION ALL
SELECT id FROM  B_Test1
-- a_test1 TotalCost 14425 , Actual Total Time 202.336
-- b_test1 TotalCost 14425 , Actual Total Time 216.108
-- Append  TotalCost 38850 , Actual Total Time 607.316
 
 CREATE DATABASE Test2;
CREATE EXTENSION dblink;--Run on Test1 Database
CREATE TABLE B_Test2(id int NOT NULL);--Run on Test2 Database

INSERT INTO B_Test2 --Run on Test2 Database
   SELECT x
   FROM generate_series(1, 1000000) AS x;
 

При использовании расширения dblink результаты выглядят следующим образом

 SELECT id FROM A_Test1
UNION ALL
SELECT id FROM dblink('dbname=test2','select id from b_test2') AS f(id integer);
-- a_test1          TotalCost 14425 , Actual Total Time 197.493
-- Function Scan    TotalCost 10    , Actual Total Time 3188.188
-- Append           TotalCost 19440 , Actual Total Time 3537.514
 

Общее время работы с dblink больше, чем без dblink.

  1. Каков обходной путь этого? Мы решили эту проблему, используя одну и ту же базу данных вместо двух отдельных баз данных.
  2. В чем причина этой медлительности?
  3. Думают ли разработчики Postgresql или разработчики, разрабатывающие это расширение, решить эту проблему с производительностью?
  4. В чем смысл totalcost ?
  5. Какие показатели я должен использовать для интерпретации результатов? Общая стоимость «— b_test1 TotalCost 14425» ниже, чем «Общая стоимость сканирования функции 10». Но его общее время слишком меньше, чем у функции scan.

Поскольку мы интерпретируем totaltime, dblink работает слишком медленно. Но, как мы интерпретируем, totalcost первый ниже, чем dblink?

Комментарии:

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

2. DbLink несколько устарел. Современная (и, вероятно, более быстрая) замена заключается в использовании внешней таблицы: postgresql.org/docs/current/ddl-foreign-data.html

3. Мой backgorund — Sql server. Я пытаюсь адаптировать postgresql. Объединение между базами данных в Sql Server выполняется быстро. Я думал, что у Postgresql было решение без проблем с производительностью, таких как Sql server.

4. Если вам часто нужны «соединения между базами данных», вам следует рассмотреть схемы, а не базы данных (схемы Postgres более гибкие, чем схемы SQL Server) Концепции SQL Server и Postgres сильно отличаются. Использование DbLink (или внешних таблиц) в Postgres больше похоже на использование связанных серверов в SQL Server.

5. Вы имеете в виду, что вы должны использовать разные схемы для каждой базы данных в одной базе данных?