是否可以使用 执行位于外部服务器上的功能postgres_fdw
?如果没有,是否有任何可用的解决方法?
我们使用外部数据包装器在单个 PostgreSQL RDS 上跨数据库进行查询。外部数据包装服务器需要为每个将查询远程服务器的用户映射一个用户。但是,为每个用户添加用户映射可能被证明容易出错。
我们所有需要查询外部数据服务器的用户都有一个共享角色,例如role_name
,在我们的 PostgreSQL 服务器上。
我们如何在用户之间共享外部数据包装服务器用户映射?
我有一台服务器,其中包含大约 7000 个数据库,这些数据库都具有几乎相同的架构。我一直在查询它们并在服务器上的单独数据库中收集有关它们内容的信息。到目前为止,我这样做的方法是使用包装在一些 Python 代码中的 dblink 查询,这些代码遍历所有数据库。当我能够事先构造一个查询并对其进行迭代时,这很好,但如果我只想快速查询其中一个数据库,因为 dblink 查询的构造有些复杂,所以效率不高。
我过去没有使用过 FDW,但我认为从服务器上的每个数据库中导入相关的模式(ta)并将它们作为对象存储在我的主数据库中会更简单。让我感到困惑的是,FDW 文档首先建议创建外部服务器对象和用户映射。由于每个数据库都在同一台服务器上并由同一用户查询,因此我不想从添加一个可能不必要的步骤开始。
所以我的问题是,是否有必要指定服务器和用户映射以在同一服务器上创建与数据库的连接,并且用户在每个数据库中都具有相同的权限?
我有一个使用 RDW 的远程 postgres 表。它包含一个 JSONB 列,我使用该 JSONB 中的值作为WHERE
条件。
远程表在 JSONB 列上有一个 GIN 索引,在hostname
我用于过滤的 - 属性上有一个索引。
EXPLAIN ANALYZE VERBOSE
SELECT
*
FROM forein_table
WHERE details->>'hostname' = 'host-xyz'
显示“远程 SQL”不包含WHERE
- 子句并且过滤是在本地完成的。另一方面
EXPLAIN ANALYZE VERBOSE
SELECT
*
FROM forein_table
WHERE details@> '{"hostname": "host-xyz"}'
发送明显更快的“WHERE”子句。
文件说:
WHERE 子句不会发送到远程服务器,除非它们仅使用内置数据类型、运算符和函数。子句中的运算符和函数也必须是 IMMUTABLE。
->>
和之间有区别@>
吗?
有没有办法WHERE details->>'hostname' = 'host-xyz'
在远程表上使用并让它下推WHERE
子句?
(我找到了一种方法,方法是创建一个VIEW
将属性提取hostname
为列的方法,然后在此视图上创建远程表……但显然这不是一种非常灵活/优雅的方法)