【发布时间】:2020-04-12 18:54:29
【问题描述】:
我正在尝试构建一个脚本系统来维护 Oracle DB 和 Postgres DB 之间的持续关系。在一个特别大的表(50B 行)上,where 子句 postgres 端的效率显然对于同步至关重要。但是,我发现我在 oracle_fdw 中的选项非常有限,因为 postgres WHERE 子句中的内容实际上转移到了 Oracle 端。在这种情况下...比较运算符。
例如,在我执行此操作时在 postgres 端
explain
SELECT
order_number
FROM
orders
WHERE
order_number > '12345'
我明白了:
Foreign Scan on orders (cost=10000.00..35675241480.00 rows=3567523148 width=9)
Filter: ((order_number)::text > '12345'::text)
Oracle
query: SELECT /*0aacedb54006ca3542bcd999c312e859*/ r1."ORDER_NUMBER"
FROM "ORDERS" r1
(3 rows)
这表明比较没有到达 Oracle,而是在本地进行过滤之前尝试下载完整表。没有布埃诺。
理想情况下,我希望 BETWEEN 条件能够向上翻译。
SELECT
order_number
FROM
orders
WHERE
order_number between '12345' and '67890'
我一直在考虑的唯一选择是使用硬编码的查询创建一个外部表。唯一的问题是该表仍将返回大量行,而且我无法一次获取和增加批次。我的查询意图是一次只传输大约 10,000 个,因为这接近 fdw 预取限制。它也是我最想在签到之间转移以查看进展情况。
如果有办法将外部表作为带有可变字段的远程查询,那会很方便吗?
【问题讨论】:
-
为什么要比较数字和字符串?
-
你用的是什么版本的 Postgres 和
oracle_fdw的什么版本? -
PostgresSQL和Oracle中
order_number的数据类型是什么? -
@a_horse_with_no_name 版本应该对此没有影响,但当然最好将它们包含在问题中。
-
@LaurenzAlbe:如果我没记错的话,非常旧的 FDW 版本从来没有下压过任何谓词——但当然你会知道得更好 ;)
标签: oracle postgresql oracle-fdw