我有一个使用 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
为列的方法,然后在此视图上创建远程表……但显然这不是一种非常灵活/优雅的方法)