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

#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