Pas*_*cal 5 postgresql postgresql-fdw
我有一个使用 RDW 的远程 postgres 表。它包含一个 JSONB 列,我使用该 JSONB 中的值作为条件WHERE。
远程表在 JSONB 列上有一个 GIN 索引,在hostname我用于过滤的 -attribute 上有一个索引。
EXPLAIN ANALYZE VERBOSE
SELECT
*
FROM forein_table
WHERE details->>'hostname' = 'host-xyz'
Run Code Online (Sandbox Code Playgroud)
显示“远程 SQL”不包含-WHERE子句,并且过滤是在本地完成的。另一方面
EXPLAIN ANALYZE VERBOSE
SELECT
*
FROM forein_table
WHERE details@> '{"hostname": "host-xyz"}'
Run Code Online (Sandbox Code Playgroud)
发送“WHERE”子句,这显然要快得多。
文档说:
WHERE 子句不会发送到远程服务器,除非它们仅使用内置数据类型、运算符和函数。子句中的运算符和函数也必须是 IMMUTABLE。
->>和之间有区别吗@>?
有没有办法在远程表上使用WHERE details->>'hostname' = 'host-xyz'并让它下推子句WHERE?
(我找到了一种方法,通过创建将属性VIEW提取hostname为列,然后在此视图上创建远程表......但显然这不是一种非常灵活/优雅的方法)
我相信这样做的原因是,在 中details->>'hostname',“主机名”是文本类型,PostgreSQL 无法向自己证明 FDW 的两侧都使用相同的默认排序规则,或者 ->> 运算符将始终无论其正确参数的排序如何,都返回相同的答案。所以它不会把它推倒。
有人讨论添加一种方法来将函数和运算符标记为对排序规则不敏感。但这最早要到 v12 才会完成。