Внешняя таблица, созданная с застреванием наследования

Я пытался создать внешнюю таблицу в своей базе данных PSQL. . Суть здесь в том, чтобы объединить одну и ту же таблицу steps из двух разных баз данных. Я хочу использовать 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')

person RobinFrcd    schedule 18.11.2020    source источник


Ответы (1)


INHERITS не копирует схему сама по себе. Вместо этого он позволяет вам структурировать ваши данные таким образом, чтобы предотвратить распространенные «проблемы» наследования в базах данных:

  • Дублирование данных: данные parent присутствуют в каждой таблице child.
  • Внешние ключи от child до parent (например, Dog.AnimalID -> Animal.Id)
  • Одна большая таблица со всем (parents и всеми типами children) в ней

С INHERITS движок Posgres позаботится о повторном объединении данных для вас, поэтому кажется, что все ваши child данные находятся в одном месте, когда вы их запрашиваете, но на самом деле они распределены по отдельным таблицам, каждая из которых содержит данные child type, а parent остались только данные, относящиеся к parents.

Итак, в вашем случае ваша таблица локальных шагов не имеет столбцов и, таким образом, выглядит так, как будто вы «унаследовали схему», но на самом деле это не так.

Ваша таблица кажется зависшей только потому, что она загружает ваши миллионы строк с удаленного сервера, поэтому там, в зависимости от условий сети и вашего запроса, может быть вполне нормально, что для возврата требуется слишком много времени.

Ссылка для дальнейшего чтения: https://www.postgresql.org/docs/12/tutorial-inheritance.html

person Abderraouf El Gasser    schedule 18.11.2020