postgresql - 使用继承卡住创建的外部表

标签 postgresql postgresql-12 foreign-data-wrapper

我一直在尝试创建一个 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 本身不会复制架构。相反,它允许您以某种方式构建数据,以防止数据库中常见的继承“问题”:

  • 数据重复:父表的数据存在于每个子表
  • childparent 的外键(例如 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/

相关文章:

sql - 来自 Postgres 存储过程的意外 OUT 值

database - Postgres 长时间运行的事务在父分区表上持有锁

postgresql - 如何使用 barman 压缩 postgres 数据库备份

postgresql - 添加 limit 子句后,Insert-select 得到更好的计划

sql - 如何查找一个函数是否存在于 PostgreSQL 中以及存在于何处?

mysql - 最适合这项工作的 DBMS 是什么?

sql - 如何查找不同表中的行数

postgresql - 为什么 Postgres 使用 "Index Scan Backward"来获取最大 ID?

postgresql - 外部数据包装并发请求

postgresql - 如何从 csv 文件更新表?