#postgresql #postgresql-12 #foreign-data-wrapper
#postgresql #postgresql-12 #внешняя оболочка данных
Вопрос:
Я пытался создать внешнюю таблицу в своей базе данных PSQL. Смысл здесь в том, чтобы объединить одну и ту же steps
таблицу из 2 разных баз данных. Я хочу использовать INHERITS
для копирования схемы.
У меня есть steps
локальная таблица и steps
таблица (с миллионами строк) на моем cache_server
. Я попытался создать внешнюю таблицу с:
CREATE FOREIGN TABLE cache_steps ()
INHERITS (steps)
SERVER cache_server
OPTIONS ( schema_name 'public', table_name 'steps');
Дело в том, что когда я это делаю, таблица локальных шагов становится непригодной для использования, блокировки нет, но она загружается вечно, я не могу выполнить какой-либо запрос к этой таблице. Я не понимаю, почему это наследование оказывает какое-либо влияние на мою steps
таблицу.
Если я создам свою внешнюю таблицу со схемой вместо inherits
, все работает нормально
CREATE FOREIGN TABLE cache_steps (
column1 text,
column2 text
)
SERVER cache_server
OPTIONS ( schema_name 'public', table_name 'steps')
Ответ №1:
INHERITS
не копирует схему как таковую. Вместо этого она позволяет вам структурировать ваши данные таким образом, чтобы предотвратить общие «проблемы» наследования в базах данных:
- Дублирование данных:
parent
данные присутствуют в каждойchild
таблице - Внешние ключи от
child
доparent
(например. Собака.AnimalID -> Animal.Id ) - Одна большая таблица со всем (
parents
и всеми типамиchildren
) в ней
При INHERITS
этом движок Posgres заботится о воссоединении данных для вас, поэтому кажется, что все ваши child
данные находятся в одном и том же месте, когда вы запрашиваете их, но на самом деле они разбиты на отдельные таблицы, каждая из которых содержит свои child type
данные, и в parent
ней остаются только данные, относящиеся к parents
.
Итак, в вашем случае ваша локальная таблица шагов не имеет столбцов и, следовательно, выглядит так, как будто вы «унаследовали схему», но на самом деле это не так.
Ваша таблица кажется застрявшей только потому, что она загружает ваши миллионы строк с удаленного сервера, поэтому там, в зависимости от условий сети и вашего запроса, вполне нормально, что для ее возврата требуется слишком много времени.
Ссылка для дальнейшего чтения: https://www.postgresql.org/docs/12/tutorial-inheritance.html