我有一个使用 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
为列的方法,然后在此视图上创建远程表……但显然这不是一种非常灵活/优雅的方法)
我相信这样做的原因是,在 中
details->>'hostname'
,'hostname' 是文本类型,而 PostgreSQL 无法向自己证明 FDW 两边都在使用相同的默认排序规则,或者 ->> 运算符将始终无论其正确参数的排序如何,都返回相同的答案。所以它不会推倒它。有人讨论过添加一种方法来将函数和运算符标记为对排序不敏感。但这最早要到 v12 才能完成。