#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.
- Каков обходной путь этого? Мы решили эту проблему, используя одну и ту же базу данных вместо двух отдельных баз данных.
- В чем причина этой медлительности?
- Думают ли разработчики Postgresql или разработчики, разрабатывающие это расширение, решить эту проблему с производительностью?
- В чем смысл totalcost ?
- Какие показатели я должен использовать для интерпретации результатов? Общая стоимость «— 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. Вы имеете в виду, что вы должны использовать разные схемы для каждой базы данных в одной базе данных?