我一直在尝试创建一个 foreign table在我的 PSQL 数据库中。这里的要点是连接来自 2 个不同数据库的相同 steps
表。我想使用 INHERITS
复制架构。
我在本地有一个 steps
表,在我的 cache_server
上有一个 steps
表(包含数百万行)。我尝试使用以下方法创建外部表:
CREATE FOREIGN TABLE cache_steps ()
INHERITS (steps)
SERVER cache_server
OPTIONS ( schema_name 'public', table_name 'steps');
问题是,当我这样做时,本地步骤表变得不可用,没有锁,但它会永远加载,我无法对此表执行任何请求。我不明白为什么这种继承会对我的 steps
表产生任何影响。
如果我使用架构而不是继承
创建外部表,一切都会正常工作
CREATE FOREIGN TABLE cache_steps (
column1 text,
column2 text
)
SERVER cache_server
OPTIONS ( schema_name 'public', table_name 'steps')
最佳答案
INHERITS
本身不会复制架构。相反,它允许您以某种方式构建数据,以防止数据库中常见的继承“问题”:
- 数据重复:
父表
的数据存在于每个子表
中 - 从
child
到parent
的外键(例如 Dog.AnimalID -> Animal.Id) - 一张大 table ,里面有所有东西(
parent
和所有类型的child
)
通过 INHERITS
,Posgres 的引擎会为您重新连接数据,因此当您查询时,您的所有 子
数据看起来都位于同一个位置,但实际上它被分散到各个表中,每个表保存一种子类型
的数据,而父
仅保留特定于父类型
的数据。
因此,在您的情况下,您的本地步骤表没有任何列,因此看起来像您“继承的架构”,但实际上并非如此。
您的表似乎卡住了,只是因为它正在从远程服务器加载数百万行,因此,根据网络条件和您的查询,它需要很长时间才能返回可能是很正常的。
进一步阅读引用:https://www.postgresql.org/docs/12/tutorial-inheritance.html
关于postgresql - 使用继承卡住创建的外部表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64890795/