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